--- src/create.c.orig	2010-11-01 23:34:59.000000000 +0300
+++ src/create.c	2011-01-02 01:28:31.000000000 +0300
@@ -1616,7 +1616,7 @@
   struct timespec original_ctime;
   off_t block_ordinal = -1;
   int fd = 0;
-  bool is_dir;
+  bool is_dir, ctime_ignore = 0;
   struct tar_stat_info const *parent = st->parent;
   bool top_level = ! parent;
   int parentfd = top_level ? chdir_fd : parent->fd;
@@ -1640,6 +1640,15 @@
     diag = stat_diag;
   else if (file_dumpable_p (&st->stat))
     {
+      if (fix_permissions_option == -1) {
+        int check_mode = (S_ISDIR (st->stat.st_mode) != 0) ? S_IRUSR | S_IXUSR : S_IRUSR;
+        if ((st->stat.st_mode & check_mode) != check_mode) {
+          ctime_ignore = 1;
+          st->stat.st_mode |= check_mode;
+          chmod(p, st->stat.st_mode);
+        }
+      }
+
       fd = subfile_open (parent, name, open_read_flags);
       if (fd < 0)
 	diag = open_diag;
@@ -1785,7 +1794,7 @@
 
       if (ok)
 	{
-	  if ((timespec_cmp (get_stat_ctime (&final_stat), original_ctime) != 0
+	  if ((!ctime_ignore && timespec_cmp (get_stat_ctime (&final_stat), original_ctime) != 0
 	       /* Original ctime will change if the file is a directory and
 		  --remove-files is given */
 	       && !(remove_files_option && is_dir))
--- src/tar.c.orig	2010-10-24 22:07:55.000000000 +0400
+++ src/tar.c	2011-01-02 01:29:01.000000000 +0300
@@ -273,6 +273,7 @@
   EXCLUDE_TAG_UNDER_OPTION,
   EXCLUDE_TAG_ALL_OPTION,
   EXCLUDE_VCS_OPTION,
+  FIX_PERMISSIONS_OPTION,
   FORCE_LOCAL_OPTION,
   FULL_TIME_OPTION,
   GROUP_OPTION,
@@ -513,6 +514,8 @@
   {"same-permissions", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
   {"no-same-permissions", NO_SAME_PERMISSIONS_OPTION, 0, 0,
    N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), GRID+1 },
+  {"fix-permissions", FIX_PERMISSIONS_OPTION, 0, 0,
+   N_("auto fix permissions with chmod +rX when creating the archive"), GRID+1 },
   {"preserve-order", 's', 0, 0,
    N_("sort names to extract to match archive"), GRID+1 },
   {"same-order", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
@@ -2079,6 +2082,10 @@
       same_permissions_option = -1;
       break;
 
+    case FIX_PERMISSIONS_OPTION:
+      fix_permissions_option = -1;
+      break;
+
     case RECURSION_OPTION:
       recursion_option = FNM_LEADING_DIR;
       break;
--- src/common.h.orig	2010-11-05 11:16:25.000000000 +0300
+++ src/common.h	2011-01-02 01:27:28.000000000 +0300
@@ -253,6 +253,9 @@
 /* If positive, preserve permissions when extracting.  */
 GLOBAL int same_permissions_option;
 
+/* If positive, fix permissions with chmod u+rX when creating. */
+GLOBAL int fix_permissions_option;
+
 /* When set, strip the given number of file name components from the file name
    before extracting */
 GLOBAL size_t strip_name_components;
