Fix: utils.c: check str*dup OOM
[lttng-tools.git] / src / common / utils.c
index b640b950e7e3d88ac95a966d60e76acaa1a88121..f5810a57c24f14ade6aef12abe54aa16e4e3d4e1 100644 (file)
@@ -30,6 +30,7 @@
 #include <inttypes.h>
 #include <grp.h>
 #include <pwd.h>
+#include <sys/file.h>
 
 #include <common/common.h>
 #include <common/runas.h>
@@ -89,6 +90,10 @@ char *utils_partial_realpath(const char *path, char *resolved_path, size_t size)
 
                /* Cut the part we will be trying to resolve */
                cut_path = strndup(path, next - path);
+               if (cut_path == NULL) {
+                       PERROR("strndup");
+                       goto error;
+               }
 
                /* Try to resolve this part */
                try_path = realpath((char *)cut_path, NULL);
@@ -142,6 +147,10 @@ char *utils_partial_realpath(const char *path, char *resolved_path, size_t size)
                 * path are pointers for the same memory space
                 */
                cut_path = strdup(prev);
+               if (cut_path == NULL) {
+                       PERROR("strdup");
+                       goto error;
+               }
 
                /* Concatenate the strings */
                snprintf(resolved_path, size, "%s%s", try_path_prev, cut_path);
@@ -215,7 +224,10 @@ char *utils_expand_path(const char *path)
 
                /* We prepare the start_path not containing it */
                start_path = strndup(absolute_path, next - absolute_path);
-
+               if (!start_path) {
+                       PERROR("strndup");
+                       goto error;
+               }
                /* And we concatenate it with the part after this string */
                snprintf(absolute_path, PATH_MAX, "%s%s", start_path, next + 2);
 
@@ -232,6 +244,10 @@ char *utils_expand_path(const char *path)
 
                /* Then we prepare the start_path not containing it */
                start_path = strndup(absolute_path, previous - absolute_path);
+               if (!start_path) {
+                       PERROR("strndup");
+                       goto error;
+               }
 
                /* And we concatenate it with the part after the '/../' */
                snprintf(absolute_path, PATH_MAX, "%s%s", start_path, next + 4);
@@ -468,6 +484,44 @@ error:
        return ret;
 }
 
+/*
+ * Create lock file to the given path and filename.
+ * Returns the associated file descriptor, -1 on error.
+ */
+LTTNG_HIDDEN
+int utils_create_lock_file(const char *filepath)
+{
+       int ret;
+       int fd;
+
+       assert(filepath);
+
+       fd = open(filepath, O_CREAT,
+               O_WRONLY | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
+       if (fd < 0) {
+               PERROR("open lock file %s", filepath);
+               ret = -1;
+               goto error;
+       }
+
+       /*
+        * Attempt to lock the file. If this fails, there is
+        * already a process using the same lock file running
+        * and we should exit.
+        */
+       ret = flock(fd, LOCK_EX | LOCK_NB);
+       if (ret) {
+               WARN("Could not get lock file %s, another instance is running.",
+                       filepath);
+               close(fd);
+               fd = ret;
+               goto error;
+       }
+
+error:
+       return fd;
+}
+
 /*
  * Recursively create directory using the given path and mode.
  *
This page took 0.025126 seconds and 4 git commands to generate.