From 7d0baab3747ad8bc65cc2604b27a61a4d89960f8 Mon Sep 17 00:00:00 2001
From: Thomas Jahns <jahns@dkrz.de>
Date: Wed, 16 Mar 2022 10:41:09 +0100
Subject: [PATCH] Fix bug in buffer size of C++ wrapper.

---
 interfaces/cdi.cpp              | 12 ++++++------
 interfaces/cdi.hpp              |  6 ++++--
 interfaces/ruby/cdiobj_wrap.cpp | 13 ++++++-------
 3 files changed, 16 insertions(+), 15 deletions(-)

diff --git a/interfaces/cdi.cpp b/interfaces/cdi.cpp
index 949d0c23c..adf209186 100644
--- a/interfaces/cdi.cpp
+++ b/interfaces/cdi.cpp
@@ -19,9 +19,9 @@ extern "C" {
  */
 CdiGrid::CdiGrid() { gridID = -1; }
 CdiGrid::CdiGrid(int gridid) {
-  char _name[CHARSIZE];
-  char _xname[CHARSIZE], _xlongname[CHARSIZE], _xstdname[CHARSIZE], _xunits[CHARSIZE];
-  char _yname[CHARSIZE], _ylongname[CHARSIZE], _ystdname[CHARSIZE], _yunits[CHARSIZE];
+  char _name[CDI_MAX_NAME];
+  char _xname[CDI_MAX_NAME], _xlongname[CDI_MAX_NAME], _xstdname[CDI_MAX_NAME], _xunits[CDI_MAX_NAME];
+  char _yname[CDI_MAX_NAME], _ylongname[CDI_MAX_NAME], _ystdname[CDI_MAX_NAME], _yunits[CDI_MAX_NAME];
 
   gridID = gridid;
   type   = gridInqType(gridID);
@@ -208,7 +208,7 @@ CdiTaxis::~CdiTaxis() { if (taxisID >= 0) taxisID = -1; }
  */
 CdiZaxis::CdiZaxis() { zaxisID = -1; }
 CdiZaxis::CdiZaxis(int zaxisid) {
-  char name[CHARSIZE], longname[CHARSIZE], units[CHARSIZE];
+  char name[CDI_MAX_NAME], longname[CDI_MAX_NAME], units[CDI_MAX_NAME];
 
   zaxisID = zaxisid;
   size    = zaxisInqSize(zaxisID);
@@ -243,7 +243,7 @@ CdiZaxis::~CdiZaxis() { if (zaxisID >= 0) zaxisID = -1; }
  */
 CdiVariable::CdiVariable() { size = -1; }
 CdiVariable::CdiVariable(int streamid,int vlistid, int varid) {
-  char _name[CHARSIZE],_longname[CHARSIZE], _units[CHARSIZE], _stdname[CHARSIZE];
+  char _name[CDI_MAX_NAME],_longname[CDI_MAX_NAME], _units[CDI_MAX_NAME], _stdname[CDI_MAX_NAME];
   streamID = streamid;
   vlistID  = vlistid;
   varID    = varid;
@@ -399,7 +399,7 @@ Cdi::getGrids() {
 
 void
 Cdi::getVars() {
-  char name[CHARSIZE];
+  char name[CDI_MAX_NAME];
   int varID, code;
 //  std::cout << vlistID << std::endl;
   for (varID = 0; varID < nvars; varID++)
diff --git a/interfaces/cdi.hpp b/interfaces/cdi.hpp
index 0df4fffc1..5d00184ea 100644
--- a/interfaces/cdi.hpp
+++ b/interfaces/cdi.hpp
@@ -5,7 +5,9 @@
 // (2.0.7 and earlier) with newer STL which no longer include cstddef
 #include <cstddef>
 
-#define CHARSIZE      128
+extern "C" {
+#include <cdi.h>
+}
 
 class CdiGrid {
   public:
@@ -44,7 +46,7 @@ class CdiTaxis {
     int ntsteps, unit;
     int rdate, rtime, vdate, vtime;
     int type, calendar, hasBounds;
-    char name[CHARSIZE];
+    char name[CDI_MAX_NAME];
     const char *unitname;
 };
 
diff --git a/interfaces/ruby/cdiobj_wrap.cpp b/interfaces/ruby/cdiobj_wrap.cpp
index ad493148e..5babaa6e7 100644
--- a/interfaces/ruby/cdiobj_wrap.cpp
+++ b/interfaces/ruby/cdiobj_wrap.cpp
@@ -29017,7 +29017,7 @@ _wrap_CdiTaxis_name_set(int argc, VALUE *argv, VALUE self) {
   char *arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  char temp2[128] ;
+  char temp2[CDI_MAX_NAME] ;
   int res2 ;
   
   if ((argc < 1) || (argc > 1)) {
@@ -29028,13 +29028,13 @@ _wrap_CdiTaxis_name_set(int argc, VALUE *argv, VALUE self) {
     SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","name", 1, self )); 
   }
   arg1 = reinterpret_cast< CdiTaxis * >(argp1);
-  res2 = SWIG_AsCharArray(argv[0], temp2, 128);
+  res2 = SWIG_AsCharArray(argv[0], temp2, CDI_MAX_NAME);
   if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char [128]","name", 2, argv[0] ));
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char [CDI_MAX_NAME]","name", 2, argv[0] ));
   }
   arg2 = reinterpret_cast< char * >(temp2);
-  if (arg2) memcpy(arg1->name,arg2,128*sizeof(char));
-  else memset(arg1->name,0,128*sizeof(char));
+  if (arg2) memcpy(arg1->name,arg2,CDI_MAX_NAME*sizeof(char));
+  else memset(arg1->name,0,CDI_MAX_NAME*sizeof(char));
   return Qnil;
 fail:
   return Qnil;
@@ -29059,7 +29059,7 @@ _wrap_CdiTaxis_name_get(int argc, VALUE *argv, VALUE self) {
   arg1 = reinterpret_cast< CdiTaxis * >(argp1);
   result = (char *)(char *) ((arg1)->name);
   {
-    size_t size = SWIG_strnlen(result, 128);
+    size_t size = SWIG_strnlen(result, CDI_MAX_NAME);
     
     
     
@@ -33576,7 +33576,6 @@ SWIGEXPORT void Init_CdiObj(void) {
   SwigClassGridsMap.mark = 0;
   SwigClassGridsMap.destroy = (void (*)(void *)) free_std_map_Sl_int_Sc_CdiGrid_Sg_;
   SwigClassGridsMap.trackObjects = 0;
-  rb_define_const(mCdiObj, "CHARSIZE", SWIG_From_int(static_cast< int >(128)));
   
   SwigClassCdiGrid.klass = rb_define_class_under(mCdiObj, "CdiGrid", rb_cObject);
   SWIG_TypeClientData(SWIGTYPE_p_CdiGrid, (void *) &SwigClassCdiGrid);
-- 
GitLab