Try to avoid long unsigned int overflow.
authorticktock35 <ticktock35@e8e0d7a0-c8d9-11dd-a880-a1081c7ac358>
Fri, 3 Apr 2009 08:21:44 +0000 (08:21 +0000)
committerticktock35 <ticktock35@e8e0d7a0-c8d9-11dd-a880-a1081c7ac358>
Fri, 3 Apr 2009 08:21:44 +0000 (08:21 +0000)
When free size is more than 4G, long unsigned int may enounter overflow

git-svn-id: http://opkg.googlecode.com/svn/trunk@210 e8e0d7a0-c8d9-11dd-a880-a1081c7ac358

libopkg/opkg_utils.c
libopkg/opkg_utils.h

index 6a827e063b65ee7c57316874eb346a55b33082b5..fb27b4060751d8238faf01ba3ed07a05172ca8a7 100644 (file)
 
 void print_pkg_status(pkg_t * pkg, FILE * file);
 
-int get_available_blocks(char * filesystem)
+long unsigned int get_available_blocks(char * filesystem)
 {
-     struct statfs sfs;
+    struct statfs sfs;
 
-     if(statfs(filesystem, &sfs)){
-         fprintf(stderr, "bad statfs\n");
-         return 0;
-     }
-     /*    fprintf(stderr, "reported fs type %x\n", sfs.f_type); */
-     return ((sfs.f_bavail * sfs.f_bsize) / 1024);
+    if(statfs(filesystem, &sfs)){
+        fprintf(stderr, "bad statfs\n");
+        return 0;
+    }
+    /*    fprintf(stderr, "reported fs type %x\n", sfs.f_type); */
+
+    // Actually ((sfs.f_bavail * sfs.f_bsize) / 1024) 
+    // and here we try to avoid overflow. 
+    if (sfs.f_bsize >= 1024) 
+        return (sfs.f_bavail * (sfs.f_bsize / 1024));
+    else if (sfs.f_bsize > 0)
+        return sfs.f_bavail / (1024 / sfs.f_bsize);
+    fprintf(stderr, "bad statfs f_bsize == 0\n");
+    return 0;
 }
 
 char **read_raw_pkgs_from_file(const char *file_name)
index c3e90a9ff5d26a2a95850d9a709494bd91dd6d89..226c7d1415b661a6abeda40ad1b95bca52e80fed 100644 (file)
@@ -25,7 +25,7 @@ void push_error_list(struct errlist **errors,char * msg);
 void reverse_error_list(struct errlist **errors);
 void free_error_list();
 
-int get_available_blocks(char * filesystem);
+long unsigned int get_available_blocks(char * filesystem);
 char **read_raw_pkgs_from_file(const char *file_name);
 char **read_raw_pkgs_from_stream(FILE *fp);
 char *trim_alloc(char * line);