diff --git a/src/rdb.c b/src/rdb.c
index ce5f99c9..2d6ac85f 100644
--- a/src/rdb.c
+++ b/src/rdb.c
@@ -766,7 +766,7 @@ int rdbSaveBackground(char *filename) {
 void rdbRemoveTempFile(pid_t childpid) {
     char tmpfile[256];
 
-    snprintf(tmpfile,256,"temp-%d.rdb", (int) childpid);
+    snprintf(tmpfile,sizeof(tmpfile),"temp-%d.rdb", (int) childpid);
     unlink(tmpfile);
 }
 
diff --git a/src/redis.c b/src/redis.c
index faed6733..c5c3f79b 100644
--- a/src/redis.c
+++ b/src/redis.c
@@ -3413,6 +3413,18 @@ static void sigShutdownHandler(int sig) {
         msg = "Received shutdown signal, scheduling shutdown...";
     };
 
+    /* SIGINT is often delivered via Ctrl+C in an interactive session.
+     * If we receive the signal the second time, we interpret this as
+     * the user really wanting to quit ASAP without waiting to persist
+     * on disk. */
+    if (server.shutdown_asap && sig == SIGINT) {
+        redisLogFromHandler(REDIS_WARNING, "You insist... exiting now.");
+        rdbRemoveTempFile(getpid());
+        exit(1); /* Exit with an error since this was not a clean shutdown. */
+    } else if (server.loading) {
+        exit(0);
+    }
+
     redisLogFromHandler(REDIS_WARNING, msg);
     server.shutdown_asap = 1;
 }
@@ -3426,7 +3438,7 @@ void setupSignalHandlers(void) {
     act.sa_flags = 0;
     act.sa_handler = sigShutdownHandler;
     sigaction(SIGTERM, &act, NULL);
-    signal(SIGINT, sigShutdownHandler);
+    sigaction(SIGINT, &act, NULL);
 
 #ifdef HAVE_BACKTRACE
     sigemptyset(&act.sa_mask);