]> git.ipfire.org Git - thirdparty/mlmmj.git/commitdiff
Another EEXIST check and some myfree's added
authormmj <none@none>
Fri, 25 Jun 2004 07:40:33 +0000 (17:40 +1000)
committermmj <none@none>
Fri, 25 Jun 2004 07:40:33 +0000 (17:40 +1000)
src/prepstdreply.c

index 6a14ff7d5c7810ecce2aa77432646d70b4742d77..ca32d33dd791f340bac56920f57c7dd7f99baa68 100644 (file)
@@ -43,7 +43,7 @@ char *prepstdreply(const char *listdir, const char *filename, const char *from,
 {
        int infd, outfd;
        size_t i;
-       char *str, *tmp, *retstr;
+       char *str, *tmp, *retstr = NULL;
 
        tmp = concatstr(3, listdir, "/text/", filename);
        infd = open(tmp, O_RDONLY);
@@ -63,17 +63,26 @@ char *prepstdreply(const char *listdir, const char *filename, const char *from,
                
        myfree(tmp);
 
-       tmp = random_str();
-       retstr = concatstr(3, listdir, "/queue/", tmp);
-       myfree(tmp);
-       outfd = open(retstr, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR);
+       do {
+                tmp = random_str();
+               myfree(retstr);
+               retstr = concatstr(3, listdir, "/queue/", tmp);
+               myfree(tmp);
+
+                outfd = open(filename, O_RDWR|O_CREAT|O_EXCL,
+                                      S_IRUSR|S_IWUSR);
+
+       } while ((outfd < 0) && (errno == EEXIST));
+       
        if(outfd < 0) {
                log_error(LOG_ARGS, "Could not open std mail %s", tmp);
+               myfree(str);
                return NULL;
        }
 
        if(writen(outfd, str, strlen(str)) < 0) {
                log_error(LOG_ARGS, "Could not write std mail");
+               myfree(str);
                return NULL;
        }
        myfree(str);
@@ -86,6 +95,7 @@ char *prepstdreply(const char *listdir, const char *filename, const char *from,
                        }
                }
                if(writen(outfd, str, strlen(str)) < 0) {
+                       myfree(str);
                        log_error(LOG_ARGS, "Could not write std mail");
                        return NULL;
                }