Thread (7 messages) flat view 7 messages, 3 authors, 2016-06-15

Re: [PATCH next v2] log_ref_setup: don't return stack-allocated array

From: Thomas Rast <hidden>
Date: 2016-06-15 22:48:57

Erick Mattos wrote:
2010/6/10 Thomas Rast [off-list ref]
quoted
-int log_ref_setup(const char *ref_name, char **log_file)
+int log_ref_setup(const char *ref_name, char *logfile, int bufsize)
 {
       int logfd, oflags = O_APPEND | O_WRONLY;
-       char logfile[PATH_MAX];

-       git_snpath(logfile, sizeof(logfile), "logs/%s", ref_name);
-       *log_file = logfile;
+       git_snpath(logfile, bufsize, "logs/%s", ref_name);
[...]
I don't see any improvement here.  Unless you want to get rid of using
references on calling functions which is only going to add another
buffer to the stack, sized PATH_MAX, once that log_file is going to be
really allocated in the heap after git_snpath().  As folks use to say
here: "changing six by half a dozen".
What the - side of the hunk above does is returning a local (stack
allocated) variable, in the form of a pointer to logfile.  Once those
go out of scope, you have zero guarantees on what happens with them.
Try the following snippet, it should cause a similar problem:

  #include <stdio.h>

  int* f()
  {
  	int i;
  	i = 42;
  	return &i;
  }

  int main()
  {
  	int *p = f();
  	if (1) {
  		char buf[1024];
  		memset(buf, 0, sizeof(buf));
  	}
  	printf("I got: %d\n", *p);
  }

Only in this case the issue is so obvious that the compiler will warn
(at least mine does).
I haven't ever seen this happening so I think you have found some
particularity of valgrind which could route a patch to it.
Admittedly my experience is somewhat limited since I don't do C coding
outside of git and some teaching.  But so far I have not had a single
false alarm with valgrind (when compiled without optimizations;
otherwise the compiler may do some magic).

-- 
Thomas Rast
trast@{inf,student}.ethz.ch
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help