Whamcloud - gitweb
LU-5832 utils: Fix buffer overflow in bound string copy
[fs/lustre-release.git] / lustre / utils / liblustreapi_hsm.c
index e47a7d9..7c2d175 100644 (file)
@@ -114,7 +114,8 @@ enum ct_event {
 };
 
 /* initialized in llapi_hsm_register_event_fifo() */
-int llapi_hsm_event_fd = -1;
+static int llapi_hsm_event_fd = -1;
+static bool created_hsm_event_fifo;
 
 static inline const char *llapi_hsm_ct_ev2str(int type)
 {
@@ -170,7 +171,7 @@ static inline const char *llapi_hsm_ct_ev2str(int type)
  * \retval 0 on success.
  * \retval -errno on error.
  */
-int llapi_hsm_write_json_event(struct llapi_json_item_list **event)
+static int llapi_hsm_write_json_event(struct llapi_json_item_list **event)
 {
        int                             rc;
        char                            time_string[40];
@@ -238,14 +239,18 @@ int llapi_hsm_write_json_event(struct llapi_json_item_list **event)
  * \retval 0 on success.
  * \retval -errno on error.
  */
-int llapi_hsm_log_ct_registration(struct hsm_copytool_private **priv,
-                                 __u32 event_type)
+static int llapi_hsm_log_ct_registration(struct hsm_copytool_private **priv,
+                                        __u32 event_type)
 {
        int                             rc;
        char                            agent_uuid[UUID_MAX];
        struct hsm_copytool_private     *ct;
        struct llapi_json_item_list     *json_items;
 
+       /* Noop unless the event fd was initialized */
+       if (llapi_hsm_event_fd < 0)
+               return 0;
+
        if (priv == NULL || *priv == NULL)
                return -EINVAL;
 
@@ -343,9 +348,10 @@ out_free:
  * \retval 0 on success.
  * \retval -errno on error.
  */
-int llapi_hsm_log_ct_progress(struct hsm_copyaction_private **phcp,
-                   const struct hsm_action_item *hai, __u32 progress_type,
-                   __u64 total, __u64 current)
+static int llapi_hsm_log_ct_progress(struct hsm_copyaction_private **phcp,
+                                    const struct hsm_action_item *hai,
+                                    __u32 progress_type,
+                                    __u64 total, __u64 current)
 {
        int                             rc;
        int                             linkno = 0;
@@ -355,6 +361,10 @@ int llapi_hsm_log_ct_progress(struct hsm_copyaction_private **phcp,
        struct hsm_copyaction_private   *hcp;
        struct llapi_json_item_list     *json_items;
 
+       /* Noop unless the event fd was initialized */
+       if (llapi_hsm_event_fd < 0)
+               return 0;
+
        if (phcp == NULL || *phcp == NULL)
                return -EINVAL;
 
@@ -459,7 +469,7 @@ out_free:
  * \retval 0 on success.
  * \retval -errno on error.
  */
-int llapi_hsm_register_event_fifo(char *path)
+int llapi_hsm_register_event_fifo(const char *path)
 {
        int read_fd;
        struct stat statbuf;
@@ -481,6 +491,8 @@ int llapi_hsm_register_event_fifo(char *path)
                                    "not a pipe or has a wrong mode", path);
                        return -errno;
                }
+       } else {
+               created_hsm_event_fifo = true;
        }
 
        /* Open the FIFO for read so that the subsequent open for write
@@ -520,7 +532,7 @@ int llapi_hsm_register_event_fifo(char *path)
  * \retval 0 on success.
  * \retval -errno on error.
  */
-int llapi_hsm_unregister_event_fifo(char *path)
+int llapi_hsm_unregister_event_fifo(const char *path)
 {
        /* Noop unless the event fd was initialized */
        if (llapi_hsm_event_fd < 0)
@@ -529,7 +541,10 @@ int llapi_hsm_unregister_event_fifo(char *path)
        if (close(llapi_hsm_event_fd) < 0)
                return -errno;
 
-       unlink(path);
+       if (created_hsm_event_fifo) {
+               unlink(path);
+               created_hsm_event_fifo = false;
+       }
 
        llapi_hsm_event_fd = -1;
 
@@ -639,11 +654,16 @@ out_free:
 }
 
 /** Register a copytool
- * \param[out] priv Opaque private control structure
- * \param mnt Lustre filesystem mount point
- * \param archive_count
- * \param archives Which archive numbers this copytool is responsible for
- * \param rfd_flags flags applied to read fd of pipe (e.g. O_NONBLOCK)
+ * \param[out] priv            Opaque private control structure
+ * \param mnt                  Lustre filesystem mount point
+ * \param archive_count                Number of valid archive IDs in \a archives
+ * \param archives             Which archive numbers this copytool is
+ *                             responsible for
+ * \param rfd_flags            flags applied to read fd of pipe
+ *                             (e.g. O_NONBLOCK)
+ *
+ * \retval 0 on success.
+ * \retval -errno on error.
  */
 int llapi_hsm_copytool_register(struct hsm_copytool_private **priv,
                                const char *mnt, int archive_count,
@@ -699,6 +719,7 @@ int llapi_hsm_copytool_register(struct hsm_copytool_private **priv,
                        llapi_err_noerrno(LLAPI_MSG_ERROR,
                                          "maximum of %zu archives supported",
                                          8 * sizeof(ct->archives));
+                       rc = -EINVAL;
                        goto out_err;
                }
                /* in the list we have a all archive wildcard
@@ -723,9 +744,7 @@ int llapi_hsm_copytool_register(struct hsm_copytool_private **priv,
                rc = -errno;
                llapi_error(LLAPI_MSG_ERROR, rc,
                            "cannot start copytool on '%s'", mnt);
-               goto out_err;
-       } else {
-               rc = 0;
+               goto out_kuc;
        }
 
        llapi_hsm_log_ct_registration(&ct, CT_REGISTER);
@@ -733,10 +752,8 @@ int llapi_hsm_copytool_register(struct hsm_copytool_private **priv,
        /* Only the kernel reference keeps the write side open */
        close(ct->kuc.lk_wfd);
        ct->kuc.lk_wfd = LK_NOFD;
-       if (rc < 0)
-               goto out_kuc;
-
        *priv = ct;
+
        return 0;
 
 out_kuc: