Browse Source

noerr: add free_noerr().

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Rusty Russell 10 years ago
parent
commit
1fe2fa08d3
3 changed files with 21 additions and 1 deletions
  1. 8 0
      ccan/noerr/noerr.c
  2. 8 0
      ccan/noerr/noerr.h
  3. 5 1
      ccan/noerr/test/run.c

+ 8 - 0
ccan/noerr/noerr.c

@@ -2,6 +2,7 @@
 #include "noerr.h"
 #include <unistd.h>
 #include <errno.h>
+#include <stdlib.h>
 
 int close_noerr(int fd)
 {
@@ -41,3 +42,10 @@ int unlink_noerr(const char *pathname)
 	errno = saved_errno;
 	return ret;
 }
+
+void free_noerr(void *p)
+{
+	int saved_errno = errno;
+	free(p);
+	errno = saved_errno;
+}

+ 8 - 0
ccan/noerr/noerr.h

@@ -30,4 +30,12 @@ int fclose_noerr(FILE *fp);
  */
 int unlink_noerr(const char *pathname);
 
+/**
+ * free_noerr - free memory without stomping errno.
+ * @p: the pointer to free.
+ *
+ * errno is saved and restored across the call to free: the standard leaves
+ * that undefined.
+ */
+void free_noerr(void *p);
 #endif /* NOERR_H */

+ 5 - 1
ccan/noerr/test/run.c

@@ -13,7 +13,7 @@ int main(int argc, char *argv[])
 	int fd;
 	FILE *fp;
 
-	plan_tests(15);
+	plan_tests(16);
 	/* Should fail to unlink. */
 	ok1(unlink(name) != 0);
 	ok1(errno == ENOENT);
@@ -59,5 +59,9 @@ int main(int argc, char *argv[])
 	ok1(errno == 100);
 	unlink(name);
 
+	errno = 101;
+	free_noerr(malloc(7));
+	ok1(errno == 101);
+
 	return exit_status();
 }