]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/job.c
Possible fix for NULL client bug #2105
[bacula/bacula] / bacula / src / dird / job.c
index fa667d40dbab3c59b0104c7220bc37e9ae297d5e..62181bd198c8e13940fcf25ff73e2acce8810f49 100644 (file)
@@ -367,16 +367,20 @@ void sd_msg_thread_send_signal(JCR *jcr, int sig)
    jcr->unlock();
 }
 
-static int cancel_file_daemon_job(UAContext *ua, const char *cmd, JCR *jcr)
+static bool cancel_file_daemon_job(UAContext *ua, const char *cmd, JCR *jcr)
 {
+   CLIENT *old_client;
+
    if (!jcr->client) {
       Dmsg0(100, "No client to cancel\n");
-      return 0;
+      return false;
    }
+   old_client = ua->jcr->client;
    ua->jcr->client = jcr->client;
    if (!connect_to_file_daemon(ua->jcr, 10, FDConnectTimeout, 1)) {
       ua->error_msg(_("Failed to connect to File daemon.\n"));
-      return 0;
+      ua->jcr->client = old_client;
+      return false;
    }
    Dmsg0(100, "Connected to file daemon\n");
    BSOCK *fd = ua->jcr->file_bsock;
@@ -386,8 +390,8 @@ static int cancel_file_daemon_job(UAContext *ua, const char *cmd, JCR *jcr)
    }
    fd->signal(BNET_TERMINATE);
    free_bsock(ua->jcr->file_bsock);
-   ua->jcr->client = NULL;
-   return 1;
+   ua->jcr->client = old_client;
+   return true;
 }
 
 static bool cancel_sd_job(UAContext *ua, const char *cmd, JCR *jcr)
@@ -437,6 +441,7 @@ static int cancel_inactive_job(UAContext *ua, JCR *jcr)
    JOB_DBR    jr;
    int        i;
    USTORE     store;
+   CLIENT     *client;
 
    if (!jcr->client) {
       memset(&cr, 0, sizeof(cr));
@@ -462,7 +467,15 @@ static int cancel_inactive_job(UAContext *ua, JCR *jcr)
       }
 
       if (acl_access_ok(ua, Client_ACL, cr.Name)) {
-         jcr->client = (CLIENT *)GetResWithName(R_CLIENT, cr.Name);
+         client = (CLIENT *)GetResWithName(R_CLIENT, cr.Name);
+         if (client) {
+            jcr->client = client;
+         } else {
+            Jmsg1(jcr, M_FATAL, 0, _("Client resource \"%s\" does not exist.\n"), cr.Name);
+            goto bail_out;
+         }
+      } else {
+         goto bail_out;
       }
    }
 
@@ -945,13 +958,13 @@ bool apply_wstorage_overrides(JCR *jcr, POOL *opool)
    if (jcr->run_next_pool_override) {
       pm_strcpy(jcr->next_pool_source, _("Run NextPool override"));
       pm_strcpy(jcr->pool_source, _("Run NextPool override"));
-      source = _("Storage from Run NextPool override");
+      source = _("Run NextPool override");
    } else if (jcr->job->next_pool) {
       /* Use Job Next Pool */
       jcr->next_pool = jcr->job->next_pool;
       pm_strcpy(jcr->next_pool_source, _("Job's NextPool resource"));
       pm_strcpy(jcr->pool_source, _("Job's NextPool resource"));
-      source = _("Storage from Job's NextPool resource");
+      source = _("Job's NextPool resource");
    } else {
       /* Default to original pool->NextPool */
       jcr->next_pool = opool->NextPool;
@@ -961,7 +974,7 @@ bool apply_wstorage_overrides(JCR *jcr, POOL *opool)
       }
       pm_strcpy(jcr->next_pool_source, _("Job Pool's NextPool resource"));
       pm_strcpy(jcr->pool_source, _("Job Pool's NextPool resource"));
-      source = _("Storage from Pool's NextPool resource");
+      source = _("Pool's NextPool resource");
    }
 
    /*
@@ -1347,14 +1360,22 @@ void set_jcr_defaults(JCR *jcr, JOB *job)
       copy_rwstorage(jcr, job->pool->storage, _("Pool resource"));
    }
    jcr->client = job->client;
+   ASSERT2(jcr->client, "jcr->client==NULL!!!");
    if (!jcr->client_name) {
       jcr->client_name = get_pool_memory(PM_NAME);
    }
    pm_strcpy(jcr->client_name, jcr->client->name());
    jcr->pool = job->pool;
    pm_strcpy(jcr->pool_source, _("Job resource"));
-   jcr->next_pool = job->pool->NextPool;
-   pm_strcpy(jcr->next_pool_source, _("Job's NextPool resource"));
+   if (job->next_pool) {
+      /* Use Job's Next Pool */
+      jcr->next_pool = job->next_pool;
+      pm_strcpy(jcr->next_pool_source, _("Job's NextPool resource"));
+   } else {
+      /* Default to original pool->NextPool */
+      jcr->next_pool = job->pool->NextPool;
+      pm_strcpy(jcr->next_pool_source, _("Job Pool's NextPool resource"));
+   }
    jcr->full_pool = job->full_pool;
    jcr->inc_pool = job->inc_pool;
    jcr->diff_pool = job->diff_pool;