Package: wmcube
Version: 0.98-6.1
Severity: important
Tags: patch

The support for multiple CPUs in wmcube (through the -c option) is
currently broken.

Attached is a patch against the wmcube-0.98.6.1 correcting this issue.
The fix actually skips irrelevant lines in /proc/stat.

The patch also switches the package hand-made patch system to dpatch, as the
previous system was not able to deapply patches in the proper order.

Regards,
-- 
Jérémy
diff -urN wmcube-0.98/debian/control wmcube-0.98.fixed/debian/control
--- wmcube-0.98/debian/control  2006-09-10 17:13:07.000000000 +0200
+++ wmcube-0.98.fixed/debian/control    2006-09-10 17:01:18.000000000 +0200
@@ -2,7 +2,7 @@
 Section: x11
 Priority: optional
 Maintainer: Filip Van Raemdonck <[EMAIL PROTECTED]>
-Build-Depends: debhelper (>= 5), libx11-dev, libxext-dev, libxpm-dev
+Build-Depends: debhelper (>= 5), dpatch, libx11-dev, libxext-dev, libxpm-dev
 Standards-Version: 3.6.2.1
 
 Package: wmcube
diff -urN wmcube-0.98/debian/patches/00list 
wmcube-0.98.fixed/debian/patches/00list
--- wmcube-0.98/debian/patches/00list   1970-01-01 01:00:00.000000000 +0100
+++ wmcube-0.98.fixed/debian/patches/00list     2006-09-10 16:58:54.000000000 
+0200
@@ -0,0 +1,3 @@
+01datapath
+02secfix
+03smpfix
diff -urN wmcube-0.98/debian/patches/01datapath.dpatch 
wmcube-0.98.fixed/debian/patches/01datapath.dpatch
--- wmcube-0.98/debian/patches/01datapath.dpatch        1970-01-01 
01:00:00.000000000 +0100
+++ wmcube-0.98.fixed/debian/patches/01datapath.dpatch  2006-09-10 
16:59:31.000000000 +0200
@@ -0,0 +1,19 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## 01datapath.dpatch
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Fix object path according to Debian rules.
+
[EMAIL PROTECTED]@
+diff -urNad wmcube-0.98~/wmcube/wmcube.c wmcube-0.98/wmcube/wmcube.c
+--- wmcube-0.98~/wmcube/wmcube.c       2000-10-23 22:11:47.000000000 +0200
++++ wmcube-0.98/wmcube/wmcube.c        2006-09-10 16:54:28.620250000 +0200
+@@ -138,7 +138,7 @@
+ 
+       char    *rotdiv = {"25"};
+       char    *rotstep = {"1"};
+-      char    *obj_filename = {""};
++      char    *obj_filename = {"/usr/share/wmcube/"};
+       int             rot;
+       int     cube_color = 1;
+       int     c = 0;
diff -urN wmcube-0.98/debian/patches/02secfix.dpatch 
wmcube-0.98.fixed/debian/patches/02secfix.dpatch
--- wmcube-0.98/debian/patches/02secfix.dpatch  1970-01-01 01:00:00.000000000 
+0100
+++ wmcube-0.98.fixed/debian/patches/02secfix.dpatch    2006-09-10 
17:03:56.000000000 +0200
@@ -0,0 +1,97 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## 02secfix.dpatch
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Security fixes.
+
[EMAIL PROTECTED]@
+diff -urNad wmcube-0.98~/wmcube/wmcube.c wmcube-0.98/wmcube/wmcube.c
+--- wmcube-0.98~/wmcube/wmcube.c       2006-09-10 16:54:58.962146250 +0200
++++ wmcube-0.98/wmcube/wmcube.c        2006-09-10 16:55:06.494617000 +0200
+@@ -346,7 +346,7 @@
+       char *tmp = malloc(32);
+       int oldzoff = 3600;
+ 
+-      sprintf(tmp,"V%s",WMCUBE_VERSION);
++      snprintf(tmp, 32, "V%s",WMCUBE_VERSION);
+       
+       RedrawWindow();
+       BlitString("WMCUBE",13,22);
+@@ -564,7 +564,7 @@
+               newx -= CHAR_WIDTH;
+       }
+       
+-      sprintf(buf, "%02i", num);
++      snprintf(buf, 1024, "%02i", num);
+       
+       BlitString(buf, newx, y);
+ }
+@@ -913,7 +913,7 @@
+               exit(0);
+       }
+ 
+-      fscanf(fp,"%s",tmp);
++      fscanf(fp,"%63s",tmp);
+       
+       if (strcmp(tmp,"WMCUBE_COORDINATES") != 0) { 
+               printf("\nError in objectfile: it must start with 
WMCUBE_COORDINATES\n\n");
+@@ -921,7 +921,7 @@
+               exit(0);
+       }
+ 
+-      fscanf(fp,"%s",tmp);
++      fscanf(fp,"%63s",tmp);
+       counter = atoi(tmp);
+ 
+       while ((strcmp(tmp,"WMCUBE_LINES") != 0) && 
(strcmp(tmp,"WMCUBE_PLANES") != 0)) {               
+@@ -938,7 +938,7 @@
+                       fclose(fp);
+                       exit(0);
+               }
+-              fscanf(fp,"%s",tmp);
++              fscanf(fp,"%63s",tmp);
+ 
+               if (feof(fp)) {
+                       printf("\nError in objectfile: you must have a section 
WMCUBE_LINES or WMCUBE_PLANES\n\n");
+@@ -1040,18 +1040,20 @@
+       char cpuid[6];
+       char check_cpu[6];
+ 
+-      sprintf(check_cpu, "cpu%d", which_cpu);
++      snprintf(check_cpu, 6, "cpu%d", which_cpu);
+ 
+       if ((fp = fopen("/proc/stat","rb")) == NULL) {
+               perror("/proc/stat required for this system");
+               return -1;
+       }
+ 
+-      if (which_cpu == -1)
++      if (which_cpu == -1) {
++              fclose (fp);
+               return 0;
+-
++      }
++ 
+       for (i = -2; i < which_cpu; i++) {
+-                fscanf(fp, "%s", cpuid);
++                fscanf(fp, "%5s %*d %*d %*d %*d", cpuid);
+         }
+ 
+       if (strcmp(check_cpu,cpuid) != 0) {
+@@ -1059,6 +1061,7 @@
+                   "sure you have an SMP system?\n",check_cpu);
+                 return -1;
+         }
++      fclose (fp);
+       return (0); 
+ }
+ 
+@@ -1072,7 +1075,7 @@
+       fp = fopen("/proc/stat","rt");
+ 
+       for (i = -2; i < which_cpu; i++) {
+-              fscanf(fp,"%s %d %d %d %d",cpuid,&cpu,&nice,&system,&idle);
++              fscanf(fp,"%5s %d %d %d %d",cpuid,&cpu,&nice,&system,&idle);
+       }
+ 
+       fclose(fp);
diff -urN wmcube-0.98/debian/patches/03smpfix.dpatch 
wmcube-0.98.fixed/debian/patches/03smpfix.dpatch
--- wmcube-0.98/debian/patches/03smpfix.dpatch  1970-01-01 01:00:00.000000000 
+0100
+++ wmcube-0.98.fixed/debian/patches/03smpfix.dpatch    2006-09-10 
17:00:15.000000000 +0200
@@ -0,0 +1,71 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## 03smpfix.dpatch
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Fix /proc/stat reading when a specific CPU is listed.
+
[EMAIL PROTECTED]@
+diff -urNad wmcube-0.98~/wmcube/wmcube.c wmcube-0.98/wmcube/wmcube.c
+--- wmcube-0.98~/wmcube/wmcube.c       2006-09-10 16:55:33.988335250 +0200
++++ wmcube-0.98/wmcube/wmcube.c        2006-09-10 16:57:39.668189750 +0200
+@@ -1037,28 +1037,29 @@
+ {
+       FILE *fp;
+       int i;
++      static char dummy[4096];
+       char cpuid[6];
+       char check_cpu[6];
+ 
+-      snprintf(check_cpu, 6, "cpu%d", which_cpu);
++      sprintf(check_cpu, "cpu%d", which_cpu);
+ 
+       if ((fp = fopen("/proc/stat","rb")) == NULL) {
+               perror("/proc/stat required for this system");
+               return -1;
+       }
+ 
+-      if (which_cpu == -1) {
+-              fclose (fp);
++      if (which_cpu == -1)
+               return 0;
+-      }
+- 
+-      for (i = -2; i < which_cpu; i++) {
+-                fscanf(fp, "%5s %*d %*d %*d %*d", cpuid);
++
++      /* Skip irrelevant CPU lines */
++      for (i = -1; i < which_cpu; i++) {
++              fgets(dummy, 4096, fp);
+         }
+ 
+-      if (strcmp(check_cpu,cpuid) != 0) {
++      if (fscanf(fp, "%s", cpuid) > 0 && strcmp(check_cpu,cpuid) != 0) {
+                 fprintf(stderr, "ERROR: could not read cpu-load on %s. Are 
you "
+                   "sure you have an SMP system?\n",check_cpu);
++              fclose (fp);
+                 return -1;
+         }
+       fclose (fp);
+@@ -1068,15 +1069,19 @@
+ int calc_cpu_total() {
+       int total, used, t=0, i;
+       static int previous_total = 0, previous_used = 0;
++      static char dummy[4096];
+       char cpuid[6];
+       int cpu,nice,system,idle;
+       FILE *fp;
+       
+       fp = fopen("/proc/stat","rt");
+ 
+-      for (i = -2; i < which_cpu; i++) {
+-              fscanf(fp,"%5s %d %d %d %d",cpuid,&cpu,&nice,&system,&idle);
+-      }
++      /* Skip irrelevant CPU lines */
++      for (i = -1; i < which_cpu; i++) {
++              fgets(dummy, 4096, fp);
++        }
++
++      fscanf(fp,"%s %d %d %d %d",cpuid,&cpu,&nice,&system,&idle);
+ 
+       fclose(fp);
+ 
diff -urN wmcube-0.98/debian/patches/datapath.dpatch 
wmcube-0.98.fixed/debian/patches/datapath.dpatch
--- wmcube-0.98/debian/patches/datapath.dpatch  2006-09-10 17:13:07.000000000 
+0200
+++ wmcube-0.98.fixed/debian/patches/datapath.dpatch    1970-01-01 
01:00:00.000000000 +0100
@@ -1,32 +0,0 @@
-#! /bin/sh -e
-
-# DP: Modified
-
-if [ $# -ne 1 ]; then
-    echo >&2 "$0: script expects -patch|-unpatch as argument"
-    exit 1
-fi
-case "$1" in
-    -patch) patch -f -p0 < $0;;
-    -unpatch) patch -f -R -p0 < $0;;
-    *)
-        echo >&2 "$0: script expects -patch|-unpatch as argument"
-        exit 1
-esac
-exit 0
-
---- wmcube/wmcube.c.orig
-+++ wmcube/wmcube.c
-@@ -136,11 +136,11 @@
-       int             loop = 0;
-       XEvent  Event;
- 
-       char    *rotdiv = {"25"};
-       char    *rotstep = {"1"};
--      char    *obj_filename = {""};
-+      char    *obj_filename = {"/usr/share/wmcube/"};
-       int             rot;
-       int     cube_color = 1;
-       int     c = 0;
-       int             invert_speed = 0;
- 
diff -urN wmcube-0.98/debian/patches/secfix.dpatch 
wmcube-0.98.fixed/debian/patches/secfix.dpatch
--- wmcube-0.98/debian/patches/secfix.dpatch    2006-09-10 17:13:07.000000000 
+0200
+++ wmcube-0.98.fixed/debian/patches/secfix.dpatch      1970-01-01 
01:00:00.000000000 +0100
@@ -1,130 +0,0 @@
-#! /bin/sh -e
-
-# DP: Modified
-
-if [ $# -ne 1 ]; then
-    echo >&2 "$0: script expects -patch|-unpatch as argument"
-    exit 1
-fi
-case "$1" in
-    -patch) patch -f -p0 < $0;;
-    -unpatch) patch -f -R -p0 < $0;;
-    *)
-        echo >&2 "$0: script expects -patch|-unpatch as argument"
-        exit 1
-esac
-exit 0
-
---- wmcube/wmcube.c.orig
-+++ wmcube/wmcube.c
-@@ -344,11 +344,11 @@
- void startup_seq() 
- {
-       char *tmp = malloc(32);
-       int oldzoff = 3600;
- 
--      sprintf(tmp,"V%s",WMCUBE_VERSION);
-+      snprintf(tmp, 32, "V%s",WMCUBE_VERSION);
-       
-       RedrawWindow();
-       BlitString("WMCUBE",13,22);
-       BlitString(tmp,15,31);
-       RedrawWindow();
-@@ -562,11 +562,11 @@
-       if (num > 999)
-       {
-               newx -= CHAR_WIDTH;
-       }
-       
--      sprintf(buf, "%02i", num);
-+      snprintf(buf, 1024, "%02i", num);
-       
-       BlitString(buf, newx, y);
- }
- 
- void line(int x1, int y1, int x2, int y2, int c)
-@@ -911,19 +911,19 @@
-       if ((fp = fopen(filename,"rt")) == NULL) {
-               printf("\nERROR: wmCube object-file not found 
(%s).\n\n",filename);
-               exit(0);
-       }
- 
--      fscanf(fp,"%s",tmp);
-+      fscanf(fp,"%63s",tmp);
-       
-       if (strcmp(tmp,"WMCUBE_COORDINATES") != 0) { 
-               printf("\nError in objectfile: it must start with 
WMCUBE_COORDINATES\n\n");
-               fclose(fp);
-               exit(0);
-       }
- 
--      fscanf(fp,"%s",tmp);
-+      fscanf(fp,"%63s",tmp);
-       counter = atoi(tmp);
- 
-       while ((strcmp(tmp,"WMCUBE_LINES") != 0) && 
(strcmp(tmp,"WMCUBE_PLANES") != 0)) {               
- 
-               matrix = (float **)realloc(matrix,(i+1)*sizeof(float *)); 
mem_alloc_error(matrix);
-@@ -936,11 +936,11 @@
-                       printf("\nError in objectfile (WMCUBE_COORDINATES 
section):\n"
-                                        "the coordinates must be listed in 
order 1..n\n\n");
-                       fclose(fp);
-                       exit(0);
-               }
--              fscanf(fp,"%s",tmp);
-+              fscanf(fp,"%63s",tmp);
- 
-               if (feof(fp)) {
-                       printf("\nError in objectfile: you must have a section 
WMCUBE_LINES or WMCUBE_PLANES\n\n");
-                       fclose(fp);
-                       exit(0);
-@@ -1038,29 +1038,32 @@
-       FILE *fp;
-       int i;
-       char cpuid[6];
-       char check_cpu[6];
- 
--      sprintf(check_cpu, "cpu%d", which_cpu);
-+      snprintf(check_cpu, 6, "cpu%d", which_cpu);
- 
-       if ((fp = fopen("/proc/stat","rb")) == NULL) {
-               perror("/proc/stat required for this system");
-               return -1;
-       }
- 
--      if (which_cpu == -1)
-+      if (which_cpu == -1) {
-+              fclose (fp);
-               return 0;
--
-+      }
-+ 
-       for (i = -2; i < which_cpu; i++) {
--                fscanf(fp, "%s", cpuid);
-+                fscanf(fp, "%5s %*d %*d %*d %*d", cpuid);
-         }
- 
-       if (strcmp(check_cpu,cpuid) != 0) {
-                 fprintf(stderr, "ERROR: could not read cpu-load on %s. Are 
you "
-                   "sure you have an SMP system?\n",check_cpu);
-                 return -1;
-         }
-+      fclose (fp);
-       return (0); 
- }
- 
- int calc_cpu_total() {
-       int total, used, t=0, i;
-@@ -1073,11 +1073,11 @@
-       FILE *fp;
-       
-       fp = fopen("/proc/stat","rt");
- 
-       for (i = -2; i < which_cpu; i++) {
--              fscanf(fp,"%s %d %d %d %d",cpuid,&cpu,&nice,&system,&idle);
-+              fscanf(fp,"%5s %d %d %d %d",cpuid,&cpu,&nice,&system,&idle);
-       }
- 
-       fclose(fp);
- 
-       used = cpu + system + use_nice*nice;
diff -urN wmcube-0.98/debian/patches/smpfix.dpatch 
wmcube-0.98.fixed/debian/patches/smpfix.dpatch
--- wmcube-0.98/debian/patches/smpfix.dpatch    2006-09-10 17:13:07.000000000 
+0200
+++ wmcube-0.98.fixed/debian/patches/smpfix.dpatch      1970-01-01 
01:00:00.000000000 +0100
@@ -1,47 +0,0 @@
-#! /bin/sh -e
-
-# DP: Modified
-
-if [ $# -ne 1 ]; then
-    echo >&2 "$0: script expects -patch|-unpatch as argument"
-    exit 1
-fi
-case "$1" in
-    -patch) patch -f -p0 < $0;;
-    -unpatch) patch -f -R -p0 < $0;;
-    *)
-        echo >&2 "$0: script expects -patch|-unpatch as argument"
-        exit 1
-esac
-exit 0
-
---- wmcube/wmcube.c.orig-bak
-+++ wmcube/wmcube.c
-@@ -1045,22 +1045,25 @@
-       if ((fp = fopen("/proc/stat","rb")) == NULL) {
-               perror("/proc/stat required for this system");
-               return -1;
-       }
- 
--      if (which_cpu == -1)
-+      if (which_cpu == -1) {
-+              fclose (fp);
-               return 0;
-+      }
- 
-       for (i = -2; i < which_cpu; i++) {
--                fscanf(fp, "%s", cpuid);
-+                fscanf(fp, "%5s %*d %*d %*d %*d", cpuid);
-         }
- 
-       if (strcmp(check_cpu,cpuid) != 0) {
-                 fprintf(stderr, "ERROR: could not read cpu-load on %s. Are 
you "
-                   "sure you have an SMP system?\n",check_cpu);
-                 return -1;
-         }
-+      fclose (fp);
-       return (0); 
- }
- 
- int calc_cpu_total() {
-       int total, used, t=0, i;
diff -urN wmcube-0.98/debian/rules wmcube-0.98.fixed/debian/rules
--- wmcube-0.98/debian/rules    2006-09-10 17:13:07.000000000 +0200
+++ wmcube-0.98.fixed/debian/rules      2006-09-10 16:52:00.000000000 +0200
@@ -23,16 +23,18 @@
 INSTALL_PROGRAM += -s
 endif
 
-debian_patches = datapath secfix
+# Include dpatch stuff.
+include /usr/share/dpatch/dpatch.make
 
-build: patched-stamp build-stamp
-build-stamp:
+build: build-stamp
+build-stamp: patch-stamp
        dh_testdir
 #      perl -pi -e 's/-DX_LOCALE//g;' Makefile
        $(MAKE) -C wmcube CFLAGS="$(CFLAGS)"
        touch build-stamp
 
-clean: reverse-patches
+clean: clean-patched unpatch
+clean-patched: 
        dh_testdir
        dh_testroot
        rm -f build-stamp
@@ -78,50 +80,6 @@
        @echo >&2 'source and diff are obsolete - use dpkg-source -b'; false
 
 binary: binary-indep binary-arch
-.PHONY: build clean binary-indep binary-arch binary
-
-# ---------------------------------------------------------------------------
-# various rules to unpack addons and (un)apply patches.
-# borrowed from egcs package
-
-patch_dir      = debian/patches
-
-apply-patches: patched-stamp
-reverse-patches:
-       @for stamp in none patched-*; do \
-         case "$$stamp" in none|patched-stamp|patched-\*) continue; esac; \
-         patch=`echo $$stamp | sed -e 's/patched-//'`; \
-         echo "trying to revert patch $$patch ..."; \
-         if [ -x $(patch_dir)/$$patch.dpatch ]; then true; else \
-           chmod +x $(patch_dir)/$$patch.dpatch; fi; \
-         if $(patch_dir)/$$patch.dpatch -unpatch; then \
-           echo "reverted $$patch patch."; \
-           rm -f $$stamp; \
-         else \
-           echo "error in reverting $$patch patch."; \
-           exit 1; \
-         fi; \
-       done
-       @echo "Removing patched-stamp"
-       @rm -f patched-stamp
-
-patched-%: $(patch_dir)/%.dpatch
-       @if [ -x $< ]; then true; else chmod +x $<; fi
-       @if [ -f $@ ]; then \
-         echo "$* patches already applied."; exit 1; \
-       fi
-       $< -patch
-       @echo "$* patches applied." > $@
-
-patched-stamp: $(foreach p,$(debian_patches),patched-$(p))
-       @echo -e "\nPatches applied:" >> pxxx
-       @for i in none $(debian_patches); do \
-         if [ -r debian/patches/$$i.dpatch ]; then \
-           echo -e "\n$$i:" >> pxxx; \
-           sed -n 's/^# *DP: */  /p' debian/patches/$$i.dpatch >> pxxx; \
-         fi \
-       done
-       @echo "Writing patched-stamp"
-       @mv -f pxxx patched-stamp
+.PHONY: build clean clean-patched binary-indep binary-arch binary patch unpatch
 
 # vi: ts=8 sw=8 ai nowrap

Attachment: signature.asc
Description: Digital signature

Reply via email to