Package: ruby-odbc
Version: 0.99998-2
Severity: normal
Tags: patch

Dear Maintainer,

As I mentioned at the end of:

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=941707

Using ruby-odbc under Bullseye's Ruby generates warnings of the deprecation of
tainting, as can be demonstrated by running the simplest of SQL queries:

$ ruby -e 'require "makeTdConnection"; db = makeTdConnection(); 
db.execute("select 0").finish();'
$ 

If warnings are enabled, the same becomes:

$ ruby -we 'require "makeTdConnection"; db = makeTdConnection(); 
db.execute("select 0").finish();'
/usr/lib/ruby/vendor_ruby/dbd/odbc/statement.rb:89: warning: 
rb_tainted_str_new_cstr is deprecated and will be removed in Ruby 3.2.
/usr/lib/ruby/vendor_ruby/dbd/odbc/statement.rb:89: warning: 
rb_tainted_str_new_cstr is deprecated and will be removed in Ruby 3.2.
/usr/lib/ruby/vendor_ruby/dbd/odbc/statement.rb:89: warning: 
rb_tainted_str_new_cstr is deprecated and will be removed in Ruby 3.2.
/usr/lib/ruby/vendor_ruby/dbd/odbc/statement.rb:89: warning: 
rb_tainted_str_new_cstr is deprecated and will be removed in Ruby 3.2.
$ 

I attach a rather simple-minded, understanding-free patch that we've been using 
without incident since 2023-04-16.


-- System Information:
Debian Release: 11.7
  APT prefers stable-security
  APT policy: (500, 'stable-security'), (500, 'stable-debug'), (500, 
'proposed-updates-debug'), (500, 'oldoldstable'), (500, 'stable'), (500, 
'oldstable')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 5.10.0-22-amd64 (SMP w/8 CPU threads)
Kernel taint flags: TAINT_PROPRIETARY_MODULE, TAINT_OOT_MODULE, 
TAINT_UNSIGNED_MODULE
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE not set
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

Versions of packages ruby-odbc depends on:
ii  libc6             2.31-13+deb11u6
ii  libodbc1          2.3.6-0.1+b1
ii  libruby2.7        2.7.4-1+deb11u1
ii  odbcinst1debian2  2.3.6-0.1+b1
ii  ruby              1:2.7+2
ii  ruby1.8 [ruby]    1.8.7.358-7.1+deb7u6
ii  unixodbc          2.3.6-0.1+b1

ruby-odbc recommends no packages.

ruby-odbc suggests no packages.

-- no debconf information
--- ext/odbc.c.orig     2023-04-16 13:02:20.028926480 -0700
+++ ext/odbc.c  2023-04-16 12:59:56.947862615 -0700
@@ -69,6 +69,16 @@
 #include "ruby/thread.h"
 #endif
 
+#if 0
+#define MAYBE_OBJ_TAINT(obj) rb_obj_taint(obj)
+#define MAYBE_TAINTED_STR_NEW(ptr, len) rb_tainted_str_new(ptr, len)
+#define MAYBE_TAINTED_STR_NEW2(ptr) rb_tainted_str_new2(ptr)
+#else
+#define MAYBE_OBJ_TAINT(obj) obj
+#define MAYBE_TAINTED_STR_NEW(ptr, len) rb_str_new(ptr, len)
+#define MAYBE_TAINTED_STR_NEW2(ptr) rb_str_new_cstr(ptr)
+#endif
+
 /*
  * Conditionally undefine aliases of ODBC installer UNICODE functions.
  */
@@ -1371,7 +1381,7 @@
     if ((cp != NULL) && (str != NULL)) {
        ulen = mkutf(cp, str, len);
     }
-    v = rb_tainted_str_new((cp != NULL) ? cp : "", ulen);
+    v = MAYBE_TAINTED_STR_NEW((cp != NULL) ? cp : "", ulen);
 #ifdef USE_RB_ENC
     rb_enc_associate(v, rb_enc);
 #endif
@@ -1861,7 +1871,7 @@
     rb_enc_associate(v, rb_enc);
 #endif
     a = rb_ary_new2(1);
-    rb_ary_push(a, rb_obj_taint(v));
+    rb_ary_push(a, MAYBE_OBJ_TAINT(v));
     CVAR_SET(Cobj, warn ? IDatatinfo : IDataterror, a);
     return STR2CSTR(v);
 }
@@ -1939,7 +1949,7 @@
                v0 = v;
                a = rb_ary_new();
            }
-           rb_ary_push(a, rb_obj_taint(v));
+           rb_ary_push(a, MAYBE_OBJ_TAINT(v));
            tracemsg(1, fprintf(stderr, "  | %s\n", STR2CSTR(v)););
        }
     }
@@ -2035,7 +2045,7 @@
                v0 = v;
                a = rb_ary_new();
            }
-           rb_ary_push(a, rb_obj_taint(v));
+           rb_ary_push(a, MAYBE_OBJ_TAINT(v));
            tracemsg(1, fprintf(stderr, "  | %s\n", STR2CSTR(v)););
        }
     }
@@ -2289,7 +2299,7 @@
     buf[SQL_MAX_MESSAGE_LENGTH] = '\0';
     v = rb_str_new2(buf);
     a = rb_ary_new2(1);
-    rb_ary_push(a, rb_obj_taint(v));
+    rb_ary_push(a, MAYBE_OBJ_TAINT(v));
     CVAR_SET(Cobj, IDataterror, a);
     rb_raise(Cerror, "%s", buf);
     return Qnil;
@@ -2379,8 +2389,8 @@
 #else
        dsnLen = (dsnLen == 0) ? (SQLSMALLINT) strlen(dsn) : dsnLen;
        descrLen = (descrLen == 0) ? (SQLSMALLINT) strlen(descr) : descrLen;
-       rb_iv_set(odsn, "@name", rb_tainted_str_new(dsn, dsnLen));
-       rb_iv_set(odsn, "@descr", rb_tainted_str_new(descr, descrLen));
+       rb_iv_set(odsn, "@name", MAYBE_TAINTED_STR_NEW(dsn, dsnLen));
+       rb_iv_set(odsn, "@descr", MAYBE_TAINTED_STR_NEW(descr, descrLen));
 #endif
        rb_ary_push(aret, odsn);
        first = dsnLen = descrLen = 0;
@@ -2444,13 +2454,13 @@
        }
 #else
        driverLen = (driverLen == 0) ? (SQLSMALLINT) strlen(driver) : driverLen;
-       rb_iv_set(odrv, "@name", rb_tainted_str_new(driver, driverLen));
+       rb_iv_set(odrv, "@name", MAYBE_TAINTED_STR_NEW(driver, driverLen));
        for (attr = attrs; *attr; attr += strlen(attr) + 1) {
            char *p = strchr(attr, '=');
 
            if ((p != NULL) && (p != attr)) {
-               rb_hash_aset(h, rb_tainted_str_new(attr, p - attr),
-                            rb_tainted_str_new2(p + 1));
+               rb_hash_aset(h, MAYBE_TAINTED_STR_NEW(attr, p - attr),
+                            MAYBE_TAINTED_STR_NEW2(p + 1));
                count++;
            }
        }
@@ -2759,7 +2769,7 @@
        if (SQLReadFileDSN((LPCSTR) sfname, (LPCSTR) saname,
                           (LPCSTR) skname, (LPSTR) valbuf,
                           sizeof (valbuf), NULL)) {
-           return rb_tainted_str_new2((char *) valbuf);
+           return MAYBE_TAINTED_STR_NEW2((char *) valbuf);
        }
     }
 #else
@@ -2769,7 +2779,7 @@
     valbuf[0] = '\0';
     if (SQLReadFileDSN(sfname, saname, skname, valbuf,
                       sizeof (valbuf), NULL)) {
-       return rb_tainted_str_new2(valbuf);
+       return MAYBE_TAINTED_STR_NEW2(valbuf);
     }
 #endif
 #if defined(HAVE_SQLINSTALLERERROR) || (defined(UNICODE) && 
defined(HAVE_SQLINSTALLERERRORW))
@@ -4548,7 +4558,7 @@
            len = 0;
        }
        mkutf(tmp, name, len);
-       v = rb_tainted_str_new2(upcase_if(tmp, 1));
+       v = MAYBE_TAINTED_STR_NEW2(upcase_if(tmp, 1));
 #ifdef USE_RB_ENC
        rb_enc_associate(v, rb_enc);
 #endif
@@ -4560,7 +4570,7 @@
        rb_iv_set(obj, "@name", uc_tainted_str_new2(name));
     }
 #else
-    rb_iv_set(obj, "@name", rb_tainted_str_new2(upcase_if(name, upc)));
+    rb_iv_set(obj, "@name", MAYBE_TAINTED_STR_NEW2(upcase_if(name, upc)));
 #endif
     v = Qnil;
     name[0] = 0;
@@ -4578,7 +4588,7 @@
 #ifdef UNICODE
        v = uc_tainted_str_new2(name);
 #else
-       v = rb_tainted_str_new2(name);
+       v = MAYBE_TAINTED_STR_NEW2(name);
 #endif
     }
     rb_iv_set(obj, "@table", v);
@@ -6670,7 +6680,7 @@
        break;
 #endif
     case SQL_C_CHAR:
-       v = rb_tainted_str_new(q->paraminfo[vnum].outbuf,
+       v = MAYBE_TAINTED_STR_NEW(q->paraminfo[vnum].outbuf,
                               q->paraminfo[vnum].rlen);
        break;
     }
@@ -6746,7 +6756,7 @@
        return uc_tainted_str_new(cname, cnLen);
 #else
        cnLen = (cnLen == 0) ? (SQLSMALLINT) strlen((char *) cname) : cnLen;
-       return rb_tainted_str_new((char *) cname, cnLen);
+       return MAYBE_TAINTED_STR_NEW((char *) cname, cnLen);
 #endif
     }
     if (TYPE(cn) != T_STRING) {
@@ -6832,7 +6842,7 @@
 
                sprintf(buf, "#%d", i);
                name = rb_str_dup(name);
-               name = rb_obj_taint(rb_str_cat2(name, buf));
+               name = MAYBE_OBJ_TAINT(rb_str_cat2(name, buf));
            }
            rb_hash_aset(res, name, obj);
        }
@@ -7081,7 +7091,7 @@
                    }
                    for (i = 0; i < 4 * q->ncols; i++) {
                        res = colbuf[i / q->ncols];
-                       cname = rb_tainted_str_new2(q->colnames[i]);
+                       cname = MAYBE_TAINTED_STR_NEW2(q->colnames[i]);
 #ifdef USE_RB_ENC
                        rb_enc_associate(cname, rb_enc);
 #endif
@@ -7089,7 +7099,7 @@
                        if (rb_funcall(res, IDkeyp, 1, cname) == Qtrue) {
                            char *p;
 
-                           cname = rb_tainted_str_new2(q->colnames[i]);
+                           cname = MAYBE_TAINTED_STR_NEW2(q->colnames[i]);
 #ifdef USE_RB_ENC
                            rb_enc_associate(cname, rb_enc);
 #endif
@@ -7330,7 +7340,7 @@
                break;
 #endif
            default:
-               v = rb_tainted_str_new(valp, curlen);
+               v = MAYBE_TAINTED_STR_NEW(valp, curlen);
                break;
            }
        }
@@ -7343,14 +7353,14 @@
            valp = q->colnames[i + offc];
            name = (q->colvals == NULL) ? Qnil : q->colvals[i + offc];
            if (name == Qnil) {
-               name = rb_tainted_str_new2(valp);
+               name = MAYBE_TAINTED_STR_NEW2(valp);
 #ifdef USE_RB_ENC
                rb_enc_associate(name, rb_enc);
 #endif
                if (rb_funcall(res, IDkeyp, 1, name) == Qtrue) {
                    char *p;
 
-                   name = rb_tainted_str_new2(valp);
+                   name = MAYBE_TAINTED_STR_NEW2(valp);
 #ifdef USE_RB_ENC
                    rb_enc_associate(name, rb_enc);
 #endif

Reply via email to