[Kst] [Bug 146502] d2asc segfaults with more than 40 vars, and should also offer to read them from a file

Barth Netterfield netterfield at physics.utoronto.ca
Thu Jun 7 21:32:29 CEST 2007


Upon review, this should be back-ported to 1.4.1

cbn

On June 7, 2007, Andrew Walker wrote:
> ------- You are receiving this mail because: -------
> You are the assignee for the bug, or are watching the assignee.
>
> http://bugs.kde.org/show_bug.cgi?id=146502
> arwalker sumusltd com changed:
>
>            What    |Removed                     |Added
> ---------------------------------------------------------------------------
>- Status|NEW                         |RESOLVED
>          Resolution|                            |FIXED
>
>
>
> ------- Additional Comments From arwalker sumusltd com  2007-06-07 21:09
> ------- SVN commit 672647 by arwalker:
>
> BUG:146502 Remove arbitrary limits on number of vectors and length of
> filename to prevent crashes
>
>  M  +30 -26    d2asc.cpp
>
>
> --- branches/work/kst/1.5/kst/src/d2asc/d2asc.cpp #672646:672647
>  @ -15,7 +15,7  @
>   *                                                                        
> *
> ***************************************************************************
>/
>
> -#include <stdlib.h> // atoi
> +#include <stdlib.h>
>  #include <kconfig.h>
>  #include <kinstance.h>
>
>  @ -26,6 +26,11  @
>  #include "kstdataobjectcollection.h"
>  #undef protected
>
> +struct fieldEntry {
> +  QString field;
> +  bool doHex;
> +};
> +
>  void Usage() {
>    fprintf(stderr, "usage: d2asc filename [-f <first frame>]\n");
>    fprintf(stderr, "             [-n <numframes>] [-s skip [-a]] \n");
>  @ -44,28 +49,26  @
>    atexit(exitHelper);
>    KInstance inst("d2asc");
>    KstDataSourcePtr file;
> -  int i;
>
>    KConfig *kConfigObject = new KConfig("kstdatarc", false, false);
>    KstDataSource::setupOnStartup(kConfigObject);
>
> -  char field_list[40][120], filename[180];
> -  bool do_hex[40];
> -  int n_field=0;
> +  fieldEntry field;
> +  QValueList<fieldEntry> fieldList;
> +  char *filename;
> +  bool do_ave = false, do_skip = false;
>    int start_frame=0, n_frames=2000000;
> -  bool do_ave = false, do_skip = false;
>    int n_skip = 0;
>    int NS=0, i_S;
> +  int i;
>
>    if (argc < 3 || argv[1][0] == '-') {
>      Usage();
>      return -1;
>    }
>
> -  for (i = 0; i < 40; i++)
> -    do_hex[i] = false;
> +  filename = argv[1];
>
> -  strcpy(filename, argv[1]);
>    for (i = 2; i < argc; i++) {
>      if (argv[i][0] == '-') {
>        if (argv[i][1] == 'f') {
>  @ -82,19 +85,22  @
>          do_ave = true;
>        } else if (argv[i][1] == 'x') {
>          i++;
> -        strcpy(field_list[n_field], argv[i]);
> -        do_hex[n_field] = true;
> -        n_field++;
> +        field.field = argv[i];
> +        field.doHex = true;
> +        fieldList.append(field);
>        } else {
>          Usage();
>        }
>      } else {
> -      strcpy(field_list[n_field], argv[i]);
> -      n_field++;
> +      field.field = argv[i];
> +      field.doHex = false;
> +      fieldList.append(field);
>      }
>    }
>
> -  if (!do_skip) do_ave = false;
> +  if (!do_skip) {
> +    do_ave = false;
> +  }
>
>    file = KstDataSource::loadSource(filename);
>    if (!file || !file->isValid() || file->isEmpty()) {
>  @ -104,30 +110,28  @
>    /** make vectors and fill the list **/
>    QPtrList<KstRVector> vlist;
>
> -  for (i=0; i<n_field; i++) {
> -
> -    if (!file->isValidField(field_list[i])) {
> +  for (i=0; i<int(fieldList.size()); i++) {
> +    if (!file->isValidField(fieldList[i].field)) {
>        fprintf(stderr, "d2asc error: field %s in file %s is not valid\n",
> -              field_list[i], filename);
> +              fieldList[i].field.latin1(), filename);
>        return -3;
>      }
> -    KstRVectorPtr v = new KstRVector(file, field_list[i],
> KstObjectTag("tag", KstObjectTag::globalTagContext), start_frame, n_frames,
> n_skip, n_skip>0, do_ave); +    KstRVectorPtr v = new KstRVector(file,
> fieldList[i].field, KstObjectTag("tag", KstObjectTag::globalTagContext),
> start_frame, n_frames, n_skip, n_skip>0, do_ave); vlist.append(v);
>    }
>
>    /* find NS */
> -  for (i = 0; i < n_field; i++) {
> -
> +  for (i = 0; i < int(fieldList.size()); i++) {
>      while (vlist.at(i)->update(-1) != KstObject::NO_CHANGE)
>        ; // read vector
> -
> -    if (vlist.at(i)->length() > NS)
> +    if (vlist.at(i)->length() > NS) {
>        NS = vlist.at(i)->length();
> +    }
>    }
>
>    for (i_S = 0; i_S < NS; i_S++) {
> -    for (i = 0; i < n_field; i++) {
> -      if (do_hex[i]) {
> +    for (i = 0; i < int(fieldList.size()); i++) {
> +      if (fieldList[i].doHex) {
>          printf("%4x ",  (int)vlist.at(i)->interpolate(i_S, NS));
>        } else {
>          printf("%.16g ", vlist.at(i)->interpolate(i_S, NS));
> _______________________________________________
> Kst mailing list
> Kst at kde.org
> https://mail.kde.org/mailman/listinfo/kst




More information about the Kst mailing list