chiark / gitweb /
Fix memory management of argument to open_input_file
authorIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 18 Apr 2010 16:41:16 +0000 (17:41 +0100)
committerIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 18 Apr 2010 16:41:16 +0000 (17:41 +0100)
backends/innduct.c

index 2a22ba2..f0cbf34 100644 (file)
@@ -259,7 +259,6 @@ typedef struct InputFile {
   void *readable_callback_user;
 
   int fd;
-  const char *path; /* ptr copy of path_<foo> or feedfile */
   struct Filemon_Perfile *filemon;
 
   oop_read *rd;
@@ -267,6 +266,7 @@ typedef struct InputFile {
   off_t offset;
 
   Counts counts;
+  char path[];
 } InputFile;
 
 typedef enum {
@@ -1113,7 +1113,7 @@ static InputFile *open_input_file(const char *path) {
     sysfatal("unable to open input file %s", path);
   }
 
-  InputFile *ipf= xmalloc(sizeof(InputFile));
+  InputFile *ipf= xmalloc(sizeof(*ipf) + strlen(path) + 1);
   memset(ipf,0,sizeof(*ipf));
 
   ipf->readable.on_readable= tailing_on_readable;
@@ -1121,7 +1121,7 @@ static InputFile *open_input_file(const char *path) {
   ipf->readable.try_read=    tailing_try_read;
 
   ipf->fd= fd;
-  ipf->path= path;
+  strcpy(ipf->path, path);
 
   return ipf;
 }
@@ -1135,8 +1135,6 @@ static void close_input_file(InputFile *ipf) {
   if (ipf->fd >= 0)
     if (close(ipf->fd)) sysdie("could not close input file %s", ipf->path);
 
-  fixme maybe free ipf->path;
-
   free(ipf);
 }
 
@@ -1818,7 +1816,7 @@ static int search_backlog_file(void) {
     debug("backlog scan: found age=%f deficiency=%ld oldest=%s",
          age, age_deficiency, oldest_path);
 
-    backlog_input_file= open_input_file();
+    backlog_input_file= open_input_file(oldest_path);
     if (!backlog_input_file) {
       warn("backlog file %s vanished as we opened it", backlog_input_file);
       goto try_again;