From c23006003d3d6b13e0f8f9fad450a7be900ced17 Mon Sep 17 00:00:00 2001 From: Miloslav Trmac Date: Oct 20 2004 14:05:23 +0000 Subject: - Don't just delete the original file when destination and current directory are on different filesystems (#65548, #123069, patch by James Antill) - Fix return type of StripDelimiter in dos2unix-3.1-safeconv.patch (#136148) --- diff --git a/dos2unix-3.1-safeconv.patch b/dos2unix-3.1-safeconv.patch index 8ea8931..11998be 100644 --- a/dos2unix-3.1-safeconv.patch +++ b/dos2unix-3.1-safeconv.patch @@ -10,7 +10,7 @@ diff -Nur dos2unix-3.1-orig/dos2unix.c dos2unix-3.1/dos2unix.c } -+int StripDelimiter(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, int CurChar) ++void StripDelimiter(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, int CurChar) +{ + int TempNextChar; + /* Don't modify Mac files when in dos2unix mode. */ diff --git a/dos2unix-3.1-tmppath.patch b/dos2unix-3.1-tmppath.patch new file mode 100644 index 0000000..e6ce242 --- /dev/null +++ b/dos2unix-3.1-tmppath.patch @@ -0,0 +1,141 @@ +--- dos2unix-3.1/dos2unix.c.tmppath 2004-10-20 16:00:00.342561008 +0200 ++++ dos2unix-3.1/dos2unix.c 2004-10-20 16:01:42.210074792 +0200 +@@ -69,6 +69,7 @@ + #ifdef __MSDOS__ + # include + #endif __MSDOS__ ++#include + #include + #include + #include +@@ -267,6 +268,39 @@ + return RetVal; + } + ++static int MakeTempFileFrom(const char *OutFN, char **fname_ret) ++{ ++ char *cpy = strdup(OutFN); ++ char *dir = NULL; ++ size_t fname_len = 0; ++ char *fname_str = NULL; ++ int fd = -1; ++ ++ *fname_ret = NULL; ++ ++ if (!cpy) ++ goto make_failed; ++ ++ dir = dirname(cpy); ++ ++ fname_len = strlen(dir) + strlen("/d2utmpXXXXXX"); ++ if (!(fname_str = malloc(fname_len))) ++ goto make_failed; ++ sprintf(fname_str, "%s%s", dir, "/d2utmpXXXXXX"); ++ *fname_ret = fname_str; ++ ++ free(cpy); ++ ++ if ((fd = mkstemp(fname_str)) == -1) ++ goto make_failed; ++ ++ return (fd); ++ ++ make_failed: ++ free(*fname_ret); ++ *fname_ret = NULL; ++ return (-1); ++} + + /* convert file ipInFN to UNIX format text and write to file ipOutFN + * RetVal: 0 if success +@@ -277,7 +311,7 @@ + int RetVal = 0; + FILE *InF = NULL; + FILE *TempF = NULL; +- char TempPath[16]; ++ char *TempPath; + struct stat StatBuf; + struct utimbuf UTimeBuf; + int fd; +@@ -286,8 +320,7 @@ + if ((ipFlag->KeepDate) && stat(ipInFN, &StatBuf)) + RetVal = -1; + +- strcpy (TempPath, "./d2utmpXXXXXX"); +- if((fd=mkstemp (TempPath))<0) { ++ if((fd = MakeTempFileFrom(ipOutFN, &TempPath))<0) { + perror("Failed to open output temp file"); + RetVal = -1; + } +@@ -304,6 +337,7 @@ + if ((!RetVal) && (InF) && ((TempF=OpenOutFile(fd)) == NULL)) + { + fclose (InF); ++ InF = NULL; + RetVal = -1; + } + +@@ -337,9 +371,6 @@ + /* can rename temp file to out file? */ + if (!RetVal) + { +- if (stat(ipOutFN, &StatBuf) == 0) +- unlink(ipOutFN); +- + if ((rename(TempPath, ipOutFN) == -1) && (!ipFlag->Quiet)) + { + fprintf(stderr, "dos2unix: problems renaming '%s' to '%s'\n", TempPath, ipOutFN); +@@ -347,6 +378,7 @@ + RetVal = -1; + } + } ++ free(TempPath); + return RetVal; + } + +@@ -362,7 +394,7 @@ + int RetVal = 0; + FILE *InF = NULL; + FILE *TempF = NULL; +- char TempPath[16]; ++ char *TempPath; + struct stat StatBuf; + struct utimbuf UTimeBuf; + mode_t mode = S_IRUSR | S_IWUSR; +@@ -374,8 +406,7 @@ + else + mode = StatBuf.st_mode; + +- strcpy (TempPath, "./u2dtmpXXXXXX"); +- if((fd=mkstemp (TempPath))<0) { ++ if((fd = MakeTempFileFrom(ipInFN, &TempPath))<0) { + perror("Failed to open output temp file"); + RetVal = -1; + } +@@ -395,6 +426,7 @@ + if ((!RetVal) && (InF) && ((TempF=OpenOutFile(fd)) == NULL)) + { + fclose (InF); ++ InF = NULL; + RetVal = -1; + } + +@@ -422,10 +454,6 @@ + RetVal = -1; + } + +- /* can delete in file? */ +- if ((!RetVal) && (unlink(ipInFN) == -1)) +- RetVal = -1; +- + /* any error? */ + if ((RetVal) && (unlink(TempPath))) + RetVal = -1; +@@ -440,6 +468,7 @@ + } + RetVal = -1; + } ++ free(TempPath); + return RetVal; + } + diff --git a/dos2unix.spec b/dos2unix.spec index c1dfbf6..17e538c 100644 --- a/dos2unix.spec +++ b/dos2unix.spec @@ -1,7 +1,7 @@ Summary: Text file format converter Name: dos2unix Version: 3.1 -Release: 20 +Release: 21 Group: Applications/Text License: Freely distributable Source: %{name}-%{version}.tar.bz2 @@ -10,6 +10,7 @@ Patch1: dos2unix-3.1-segfault.patch Patch2: dos2unix-3.1-safeconv.patch Patch3: dos2unix-3.1-manpage-update-57507.patch Patch4: dos2unix-3.1-preserve-file-modes.patch +Patch5: dos2unix-3.1-tmppath.patch Buildroot: %{_tmppath}/%{name}-%{version}-root @@ -23,6 +24,7 @@ Dos2unix converts DOS or MAC text files to UNIX format. %patch2 -p1 -b .safeconv %patch3 -p1 -b .manpage-update-57507 %patch4 -p1 -b .preserve-file-modes +%patch5 -p1 -b .tmppath for I in *.[ch]; do sed -e 's,#endif.*,#endif,g' -e 's,#else.*,#else,g' $I > $I.new @@ -54,6 +56,11 @@ install -m444 mac2unix.1 $RPM_BUILD_ROOT%{_mandir}/man1 rm -rf $RPM_BUILD_ROOT %changelog +* Wed Oct 20 2004 Miloslav Trmac - 3.1-21 +- Don't just delete the original file when destination and current directory + are on different filesystems (#65548, #123069, patch by James Antill) +- Fix return type of StripDelimiter in dos2unix-3.1-safeconv.patch (#136148) + * Wed Oct 6 2004 Mike A. Harris 3.1-20 - Added dos2unix-3.1-manpage-update-57507.patch to fix manpage (#57507) - Added dos2unix-3.1-preserve-file-modes.patch to properly preserve file