strlen(PG_TEMP_FILE_PREFIX)) == 0)
            continue;
 
+       /*
+        * Check if the postmaster has signaled us to exit, and abort
+        * with an error in that case. The error handler further up
+        * will call do_pg_abort_backup() for us.
+        */
+       if (walsender_shutdown_requested || walsender_ready_to_stop)
+           ereport(ERROR,
+                   (errmsg("shutdown requested, aborting active base backup")));
+
        snprintf(pathbuf, MAXPGPATH, "%s/%s", path, de->d_name);
 
        /* Skip postmaster.pid in the data directory */
    while ((cnt = fread(buf, 1, Min(sizeof(buf), statbuf->st_size - len), fp)) > 0)
    {
        /* Send the chunk as a CopyData message */
-       pq_putmessage('d', buf, cnt);
+       if (pq_putmessage('d', buf, cnt))
+           ereport(ERROR,
+                   (errmsg("base backup could not send data, aborting backup")));
+
        len += cnt;
 
        if (len >= statbuf->st_size)
 
 
 /* Flags set by signal handlers for later service in main loop */
 static volatile sig_atomic_t got_SIGHUP = false;
-static volatile sig_atomic_t shutdown_requested = false;
-static volatile sig_atomic_t ready_to_stop = false;
+volatile sig_atomic_t walsender_shutdown_requested = false;
+volatile sig_atomic_t walsender_ready_to_stop = false;
 
 /* Signal handlers */
 static void WalSndSigHupHandler(SIGNAL_ARGS);
         * When SIGUSR2 arrives, we send all outstanding logs up to the
         * shutdown checkpoint record (i.e., the latest record) and exit.
         */
-       if (ready_to_stop)
+       if (walsender_ready_to_stop)
        {
            if (!XLogSend(output_message, &caughtup))
                break;
            if (caughtup)
-               shutdown_requested = true;
+               walsender_shutdown_requested = true;
        }
 
        /* Normal exit from the walsender is here */
-       if (shutdown_requested)
+       if (walsender_shutdown_requested)
        {
            /* Inform the standby that XLOG streaming was done */
            pq_puttextmessage('C', "COPY 0");
 
            if (!XLogSend(output_message, &caughtup))
                break;
-           if (caughtup && !got_SIGHUP && !ready_to_stop && !shutdown_requested)
+           if (caughtup && !got_SIGHUP && !walsender_ready_to_stop && !walsender_shutdown_requested)
            {
                /*
                 * XXX: We don't really need the periodic wakeups anymore,
 static void
 WalSndShutdownHandler(SIGNAL_ARGS)
 {
-   shutdown_requested = true;
+   walsender_shutdown_requested = true;
    if (MyWalSnd)
        SetLatch(&MyWalSnd->latch);
 }
 static void
 WalSndLastCycleHandler(SIGNAL_ARGS)
 {
-   ready_to_stop = true;
+   walsender_ready_to_stop = true;
    if (MyWalSnd)
        SetLatch(&MyWalSnd->latch);
 }