Skip to Content.
Sympa Menu

freetds - Re: [freetds] bug fixes

freetds AT lists.ibiblio.org

Subject: FreeTDS Development Group

List archive

Chronological Thread  
  • From: Frediano Ziglio <freddy77 AT gmail.com>
  • To: FreeTDS Development Group <freetds AT lists.ibiblio.org>
  • Subject: Re: [freetds] bug fixes
  • Date: Wed, 25 May 2011 09:04:23 +0200

Thanks Christos,

Your patch contains a lot of stuff. I think that the only really bug
fix is queryout, other stuff will go to HEAD. Note that defncopy patch
is wrong, you save password to a variable and not use it.

Regards
Frediano

2011/5/24 Christos Zoulas <christos AT zoulas.com>:
> Hello,
>
> Here are a bunch of fixes, some I sent before:
>
> - Add a new getpassarg function in replacements that centralizes password
>  retrieval from the command line arguments, and setting the command line
>  argument to *'s so that it is not visible with ps. This was done
>  differently in many places. Handling it in one place only makes sense.
>
> - Fix the freebcp usage to mention queryout.
>
> - In tsql add a usage function, and a flag [-a] to set the application
>  name from the command line.
>
> - Delete trailing spaces from ct.c
>
> - bcp queryout broke recently: Fix broken code in bulk.c that attempted
>  to get just the metadata using "select * from %s where 0 = 1".
>  Guess what? %s is not the table name in queryout... Fix it properly
>  using FMTONLY like it was done in freebcp.c. Again this code is
>  duplicated from freebcp.c and we probably don't need to do it
>  there anymore, and we should move the functionality to the library.
>
> christos
>
> --- /dev/null   2011-05-24 09:57:14.000000000 -0400
> +++ getpassarg.c        2011-05-24 14:00:53.000000000 -0400
> @@ -0,0 +1,74 @@
> +/* FreeTDS - Library of routines accessing Sybase and Microsoft databases
> + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005  Brian
> Bruns
> + * Copyright (C) 2006, 2007, 2008, 2009, 2010  Frediano Ziglio
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Library General Public
> + * License as published by the Free Software Foundation; either
> + * version 2 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Library General Public License for more details.
> + *
> + * You should have received a copy of the GNU Library General Public
> + * License along with this library; if not, write to the
> + * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
> + * Boston, MA 02111-1307, USA.
> + */
> +
> +#if HAVE_CONFIG_H
> +#include <config.h>
> +#endif
> +
> +#include <stdio.h>
> +
> +#if HAVE_LIMITS_H
> +#include <limits.h>
> +#endif
> +
> +#if HAVE_STRING_H
> +#include <string.h>
> +#endif /* HAVE_STRING_H */
> +
> +#include <tds.h>
> +#include <tdsthread.h>
> +#include <tdsconvert.h>
> +#include <replacements.h>
> +#include <sybfront.h>
> +#include <sybdb.h>
> +#include <syberror.h>
> +#include <dblib.h>
> +
> +#ifdef DMALLOC
> +#include <dmalloc.h>
> +#endif
> +
> +TDS_RCSID(var, "Id: getpass.c,v 1.1.1.14 2010/06/07 14:37:14 christos
> Exp");
> +
> +/*
> + * return a copy of the password, reading from stdin if arg is '-'
> + * trashing he argument in the process.
> + */
> +char *
> +getpassarg(char *arg)
> +{
> +       char pwd[255], *ptr, *q;
> +
> +       if (strcmp(arg, "-") == 0) {
> +               memset(pwd, 0, sizeof(pwd));
> +               if (fgets(pwd, sizeof(pwd), stdin) == NULL)
> +                       return NULL;
> +               ptr = strchr(pwd, '\n');
> +               if (ptr) *ptr = '\0';
> +               arg = pwd;
> +       }
> +
> +       ptr = strdup(arg);
> +
> +       for (q = arg; *q; *q++ = '*')
> +               continue;
> +
> +       return ptr;
> +}
>
> Index: include/replacements.h
> ===================================================================
> RCS file:
> /src/twosigma/cvsroot/external/public/freetds/include/replacements.h,v
> retrieving revision 1.1.1.9
> retrieving revision 1.3
> diff -u -r1.1.1.9 -r1.3
> --- include/replacements.h      23 May 2011 18:18:07 -0000      1.1.1.9
> +++ include/replacements.h      23 May 2011 18:29:07 -0000      1.3
> @@ -96,6 +96,8 @@
>  char *tds_basename(char *path);
>  #endif
>
> +char *getpassarg(char *arg);
> +
>  /*
>  * Microsoft's C Runtime library is missing strcasecmp and strncasecmp.
>  * Other Win32 C runtime libraries, notably minwg, may define it.
> Index: src/apps/bsqldb.c
> ===================================================================
> RCS file: /src/twosigma/cvsroot/external/public/freetds/src/apps/bsqldb.c,v
> retrieving revision 1.1.1.8
> retrieving revision 1.4
> diff -u -r1.1.1.8 -r1.4
> --- src/apps/bsqldb.c   23 May 2011 18:18:07 -0000      1.1.1.8
> +++ src/apps/bsqldb.c   23 May 2011 21:04:43 -0000      1.4
> @@ -828,8 +828,7 @@
>                        username = strdup(optarg);
>                        break;
>                case 'P':
> -                       password = strdup(optarg);
> -                       memset(optarg, 0, strlen(optarg));
> +                       password = getpassarg(optarg);
>                        break;
>                case 'S':
>                        options->servername = strdup(optarg);
> @@ -889,10 +888,10 @@
>                DBSETLPWD(login, password);
>                memset(password, 0, strlen(password));
>        } else if (username) {
> -               char password[128];
> +               char pwd[128];
>
> -               readpassphrase("Password: ", password, sizeof(password),
> RPP_ECHO_OFF);
> -               DBSETLPWD(login, password);
> +               readpassphrase("Password: ", pwd, sizeof(pwd),
> RPP_ECHO_OFF);
> +               DBSETLPWD(login, pwd);
>         }
>
>        if (!options->servername) {
> Index: src/apps/bsqlodbc.c
> ===================================================================
> RCS file:
> /src/twosigma/cvsroot/external/public/freetds/src/apps/bsqlodbc.c,v
> retrieving revision 1.1.1.5
> retrieving revision 1.3
> diff -u -r1.1.1.5 -r1.3
> Index: src/apps/defncopy.c
> ===================================================================
> RCS file:
> /src/twosigma/cvsroot/external/public/freetds/src/apps/defncopy.c,v
> retrieving revision 1.1.1.7
> retrieving revision 1.3
> diff -u -r1.1.1.7 -r1.3
> --- src/apps/defncopy.c 23 May 2011 18:18:07 -0000      1.1.1.7
> +++ src/apps/defncopy.c 23 May 2011 18:29:07 -0000      1.3
> @@ -652,6 +652,7 @@
>  get_login(int argc, char *argv[], OPTIONS *options)
>  {
>        LOGINREC *login;
> +       char *password;
>        int ch;
>        int fdomain = TRUE;
>
> @@ -682,8 +683,7 @@
>                        fdomain = FALSE;
>                        break;
>                case 'P':
> -                       DBSETLPWD(login, optarg);
> -                       memset(optarg, 0, strlen(optarg));
> +                       password = getpassarg(optarg);
>                        fdomain = FALSE;
>                        break;
>                case 'S':
> Index: src/apps/freebcp.c
> ===================================================================
> RCS file: /src/twosigma/cvsroot/external/public/freetds/src/apps/freebcp.c,v
> retrieving revision 1.1.1.12
> retrieving revision 1.4
> diff -u -r1.1.1.12 -r1.4
> --- src/apps/freebcp.c  23 May 2011 18:18:07 -0000      1.1.1.12
> +++ src/apps/freebcp.c  23 May 2011 21:56:14 -0000      1.4
> @@ -267,18 +267,7 @@
>                        break;
>                case 'P':
>                        pdata->Pflag++;
> -                       if ((strcmp(optarg, "-")) == 0) {
> -                               char pwd[255], *nl;
> -                               memset(pwd, 0, 255);
> -                               fgets(pwd, 255, stdin);
> -                               nl = strchr(pwd, '\n');
> -                               if(nl) *nl = '\0';
> -                               pdata->pass = strdup(pwd);
> -                               memset(pwd, 0, 255);
> -                       } else {
> -                               pdata->pass = strdup(optarg);
> -                               memset(optarg, 0, strlen(optarg));
> -                       }
> +                       pdata->pass = getpassarg(optarg);
>                        break;
>                case 'i':
>                        free(pdata->inputfile);
> @@ -761,7 +750,7 @@
>  void
>  pusage(void)
>  {
> -       fprintf(stderr, "usage:  freebcp [[database_name.]owner.]table_name
> {in | out} datafile\n");
> +       fprintf(stderr, "usage:  freebcp
> [[database_name.]owner.]table_name|query {in | out | queryout }
> datafile\n");
>        fprintf(stderr, "        [-m maxerrors] [-f formatfile] [-e
> errfile]\n");
>        fprintf(stderr, "        [-F firstrow] [-L lastrow] [-b
> batchsize]\n");
>        fprintf(stderr, "        [-n] [-c] [-t field_terminator] [-r
> row_terminator]\n");
> Index: src/apps/tsql.c
> ===================================================================
> RCS file: /src/twosigma/cvsroot/external/public/freetds/src/apps/tsql.c,v
> retrieving revision 1.1.1.12
> retrieving revision 1.20
> diff -u -r1.1.1.12 -r1.20
> --- src/apps/tsql.c     23 May 2011 18:18:07 -0000      1.1.1.12
> +++ src/apps/tsql.c     23 May 2011 18:29:07 -0000      1.20
> @@ -292,6 +292,23 @@
>  }
>
>  static void
> +tsql_print_usage(const char *progname)
> +{
> +       fprintf(stderr,
> +               "Usage:\t%s [-a <appname>] [-S <server> | -H <hostname> -p
> <port>] -U <username> [-P <password>] [-I <config file>] [-o <options>] [-t
> delim] [-r delim] [-D database]\n"
> +               "\t%s -C\n"
> +               "Options:\n"
> +               "\tf\tDo not print footer\n"
> +               "\th\tDo not print header\n"
> +               "\tt\tPrint time informations\n"
> +               "\tv\tPrint TDS version\n"
> +               "\tq\tQuiet\n\n"
> +               "\tDelimiters can be multi-char strings appropriately
> escaped for your shell.\n"
> +               "\tDefault column delimitor is <tab>; default row delimiter
> is <newline>\n",
> +               progname, progname);
> +}
> +
> +static void
>  reset_getopt(void)
>  {
>  #ifdef HAVE_GETOPT_OPTRESET
> @@ -390,12 +410,18 @@
>        char *hostname = NULL, *servername = NULL;
>        char *username = NULL, *password = NULL;
>        char *confile = NULL;
> +       const char *appname = "TSQL";
> +       const char *locale = NULL;
>        int opt, port=0, use_domain_login=0;
>        const char *charset = NULL;
>        char *opt_flags_str = NULL;
>
> -       while ((opt = getopt(argc, argv, "H:S:I:J:P:U:p:Co:t:r:D:Lv")) !=
> -1) {
> +       while ((opt = getopt(argc, argv, "a:H:S:I:J:P:U:p:Co:t:r:D:Lv")) !=
> -1)
> +       {
>                switch (opt) {
> +               case 'a':
> +                       appname = optarg;
> +                       break;
>                case 't':
>                        opt_col_term = strdup(optarg);
>                        break;
> @@ -422,8 +448,7 @@
>                        break;
>                case 'P':
>                        free(password);
> -                       password = strdup(optarg);
> -                       memset(optarg, 0, strlen(optarg));
> +                       password = getpassarg(optarg);
>                        break;
>                case 'I':
>                        free(confile);
> @@ -461,7 +486,7 @@
>                        exit(0);
>                        break;
>                default:
> -                       fprintf(stderr, "%s: error: invalid option %c\n",
> argv[0], (char)opt);
> +                       tsql_print_usage(argv[0]);
>                        exit(1);
>                        break;
>                }
> @@ -544,7 +569,7 @@
>        /* if it's a servername */
>        if (servername) {
>                tds_set_user(login, username);
> -               tds_set_app(login, "TSQL");
> +               tds_set_app(login, appname);
>                tds_set_library(login, "TDS-Library");
>                tds_set_server(login, servername);
>                if (charset) tds_set_client_charset(login, charset);
> @@ -556,7 +581,7 @@
>                /* else we specified hostname/port */
>        } else {
>                tds_set_user(login, username);
> -               tds_set_app(login, "TSQL");
> +               tds_set_app(login, appname);
>                tds_set_library(login, "TDS-Library");
>                tds_set_server(login, hostname);
>                tds_set_port(login, port);
> Index: src/ctlib/ct.c
> ===================================================================
> RCS file: /src/twosigma/cvsroot/external/public/freetds/src/ctlib/ct.c,v
> retrieving revision 1.1.1.16
> retrieving revision 1.17
> diff -u -r1.1.1.16 -r1.17
> --- src/ctlib/ct.c      23 May 2011 18:18:07 -0000      1.1.1.16
> +++ src/ctlib/ct.c      23 May 2011 18:29:08 -0000      1.17
> @@ -620,11 +620,11 @@
>        /* override locale settings with CS_CONNECTION settings, if any */
>        if (con->locale) {
>                if (con->locale->charset) {
> -                       if (!tds_dstr_copy(&connection->server_charset,
> con->locale->charset))
> +                       if (!tds_dstr_copy(&connection->server_charset,
> con->locale->charset))
>                                goto Cleanup;
>                }
>                if (con->locale->language) {
> -                       if (!tds_dstr_copy(&connection->language,
> con->locale->language))
> +                       if (!tds_dstr_copy(&connection->language,
> con->locale->language))
>                                goto Cleanup;
>                }
>                if (con->locale->time && con->tds_socket->tds_ctx) {
> @@ -3467,7 +3467,7 @@
>                case CS_FALSE:
>                        break;  /* end valid choices */
>                default:
> -                       if (action == CS_SET)
> +                       if (action == CS_SET)
>                                return CS_FAIL;
>                }
>                break;
> @@ -3480,7 +3480,7 @@
>                        tds_option = TDS_OPT_ARITHABORTOFF;
>                        break;
>                default:
> -                       if (action == CS_SET)
> +                       if (action == CS_SET)
>                                return CS_FAIL;
>                        tds_option = TDS_OPT_ARITHABORTON;
>                }
> @@ -3496,7 +3496,7 @@
>                        tds_option = TDS_OPT_ARITHIGNOREOFF;
>                        break;
>                default:
> -                       if (action == CS_SET)
> +                       if (action == CS_SET)
>                                return CS_FAIL;
>                }
>                tds_argument.i = TDS_OPT_ARITHOVERFLOW |
> TDS_OPT_NUMERICTRUNC;
> @@ -3538,7 +3538,7 @@
>                        tds_argument.ti = TDS_OPT_SATURDAY;
>                        break;
>                default:
> -                       if (action == CS_SET)
> +                       if (action == CS_SET)
>                                return CS_FAIL;
>                }
>                tds_argsize = (action == CS_SET) ? 1 : 0;
> @@ -3565,7 +3565,7 @@
>                        tds_argument.ti = TDS_OPT_FMTDYM;
>                        break;
>                default:
> -                       if (action == CS_SET)
> +                       if (action == CS_SET)
>                                return CS_FAIL;
>                }
>                tds_argsize = (action == CS_SET) ? 1 : 0;
> @@ -3584,7 +3584,7 @@
>                        tds_argument.ti = TDS_OPT_LEVEL3;
>                        break;
>                default:
> -                       if (action == CS_SET)
> +                       if (action == CS_SET)
>                                return CS_FAIL;
>                }
>                tds_argsize = (action == CS_SET) ? 1 : 0;
> @@ -3596,7 +3596,7 @@
>                case CS_FALSE:
>                        break;
>                default:
> -                       if (action == CS_SET)
> +                       if (action == CS_SET)
>                                return CS_FAIL;
>                }
>                tds_argument.ti = !*(char *) param;
> Index: src/replacements/Makefile.am
> ===================================================================
> RCS file:
> /src/twosigma/cvsroot/external/public/freetds/src/replacements/Makefile.am,v
> retrieving revision 1.1.1.10
> retrieving revision 1.2
> diff -u -r1.1.1.10 -r1.2
> --- src/replacements/Makefile.am        23 May 2011 18:18:07 -0000      
> 1.1.1.10
> +++ src/replacements/Makefile.am        23 Jun 2010 21:16:33 -0000      1.2
> @@ -1,13 +1,12 @@
> -# Id: Makefile.am,v 1.17 2010/10/12 15:36:24 jklowden Exp
> +# $Id: Makefile.am,v 1.2 2010/06/23 21:16:33 christos Exp $
>  AM_CPPFLAGS=                   -I$(top_srcdir)/include
> -I$(top_srcdir)/src/replacements
>  noinst_LTLIBRARIES=            libreplacements.la
> -libreplacements_la_SOURCES=    iconv.c gettimeofday.c fakepoll.c
> +libreplacements_la_SOURCES=    iconv.c gettimeofday.c fakepoll.c
> getpassarg.c
>  libreplacements_la_LDFLAGS=
>  libreplacements_la_LIBADD=     @LTLIBOBJS@
>  EXTRA_DIST=    asprintf.c \
>                atoll.c \
>                basename.c \
> -               getopt.c \
>                readpassphrase.c \
>                strlcat.c \
>                strlcpy.c \
> Index: src/tds/bulk.c
> ===================================================================
> RCS file: /src/twosigma/cvsroot/external/public/freetds/src/tds/bulk.c,v
> retrieving revision 1.1.1.4
> retrieving revision 1.2
> diff -u -r1.1.1.4 -r1.2
> --- src/tds/bulk.c      23 May 2011 18:18:07 -0000      1.1.1.4
> +++ src/tds/bulk.c      23 May 2011 21:55:06 -0000      1.2
> @@ -37,6 +37,7 @@
>  #include "tds_checks.h"
>  #include "tdsbytes.h"
>  #include "replacements.h"
> +#include "sybdb.h"
>  #ifdef DMALLOC
>  #include <dmalloc.h>
>  #endif
> @@ -68,11 +69,17 @@
>        TDSCOLUMN *curcol;
>        TDS_INT result_type;
>        int i, rc;
> +       const char *fmt;
>
>        /* FIXME don't leave state in processing state */
>
>        /* TODO quote tablename if needed */
> -       if (tds_submit_queryf(tds, "select * from %s where 0 = 1",
> bcpinfo->tablename) == TDS_FAIL)
> +       if (bcpinfo->direction != DB_QUERYOUT)
> +           fmt = "SET FMTONLY ON select * from %s SET FMTONLY OFF";
> +       else
> +           fmt = "SET FMTONLY ON %s SET FMTONLY OFF";
> +
> +       if (tds_submit_queryf(tds, fmt, bcpinfo->tablename) == TDS_FAIL)
>                /* TODO return an error ?? */
>                /* Attempt to use Bulk Copy with a non-existent Server table
> (might be why ...) */
>                return TDS_FAIL;
> _______________________________________________
> FreeTDS mailing list
> FreeTDS AT lists.ibiblio.org
> http://lists.ibiblio.org/mailman/listinfo/freetds
>



Archive powered by MHonArc 2.6.24.

Top of Page