From 6b2919db9a14d6b7ddffb7fe504060a3eec9df65 Mon Sep 17 00:00:00 2001 From: Povilas Kanapickas Date: Fri, 2 Aug 2019 22:38:53 +0300 Subject: [PATCH 1/2] genesys: Remove manual allocations in device class --- backend/genesys.cc | 50 +++++++++++++++++++++++---------------- backend/genesys_device.cc | 3 --- backend/genesys_device.h | 2 +- backend/genesys_low.h | 2 -- 4 files changed, 30 insertions(+), 27 deletions(-) diff --git a/backend/genesys.cc b/backend/genesys.cc index bd4e08b86..755f4384a 100644 --- a/backend/genesys.cc +++ b/backend/genesys.cc @@ -66,14 +66,22 @@ #include "../include/sane/sanei_magic.h" #include "genesys_devices.cc" +#include #include #include #include #include #include +// Data that we allocate to back SANE_Device objects in s_sane_devices +struct SANE_Device_Data +{ + std::string name; +}; + StaticInit> s_scanners; StaticInit> s_sane_devices; +StaticInit> s_sane_devices_data; StaticInit> s_sane_devices_ptrs; StaticInit> s_devices; @@ -4402,7 +4410,7 @@ static char *calibration_filename(Genesys_Device *currdev) } if(count>1) { - snprintf(filename,sizeof(filename),"%s.cal",currdev->file_name); + std::snprintf(filename, sizeof(filename), "%s.cal", currdev->file_name.c_str()); for(i=0;iemplace_back(); dev = &s_devices->back(); - dev->file_name = new_devname; + dev->file_name = devname; dev->model = &found_usb_dev->model; dev->vendorId = found_usb_dev->vendor; @@ -5129,8 +5132,8 @@ attach (SANE_String_Const devname, Genesys_Device ** devp, SANE_Bool may_wait) dev->usb_mode = 0; /* i.e. unset */ dev->already_initialized = SANE_FALSE; - DBG(DBG_info, "%s: found %s flatbed scanner %s at %s\n", __func__, dev->model->vendor, - dev->model->model, dev->file_name); + DBG(DBG_info, "%s: found %s flatbed scanner %s at %s\n", __func__, dev->model->vendor, + dev->model->model, dev->file_name.c_str()); if (devp) { *devp = dev; @@ -5412,6 +5415,7 @@ sane_init_impl(SANE_Int * version_code, SANE_Auth_Callback authorize) s_scanners.init(); s_devices.init(); s_sane_devices.init(); + s_sane_devices_data.init(); s_sane_devices_ptrs.init(); genesys_init_sensor_tables(); genesys_init_frontend_tables(); @@ -5464,8 +5468,10 @@ sane_get_devices_impl(const SANE_Device *** device_list, SANE_Bool local_only) probe_genesys_devices (); s_sane_devices->clear(); + s_sane_devices_data->clear(); s_sane_devices_ptrs->clear(); s_sane_devices->reserve(s_devices->size()); + s_sane_devices_data->reserve(s_devices->size()); s_sane_devices_ptrs->reserve(s_devices->size() + 1); for (auto dev_it = s_devices->begin(); dev_it != s_devices->end();) { @@ -5473,8 +5479,11 @@ sane_get_devices_impl(const SANE_Device *** device_list, SANE_Bool local_only) sanei_usb_find_devices(dev_it->vendorId, dev_it->productId, check_present); if (present) { s_sane_devices->emplace_back(); + s_sane_devices_data->emplace_back(); auto& sane_device = s_sane_devices->back(); - sane_device.name = dev_it->file_name; + auto& sane_device_data = s_sane_devices_data->back(); + sane_device_data.name = dev_it->file_name; + sane_device.name = sane_device_data.name.c_str(); sane_device.vendor = dev_it->model->vendor; sane_device.model = dev_it->model->model; sane_device.type = "flatbed scanner"; @@ -5513,7 +5522,7 @@ sane_open_impl(SANE_String_Const devicename, SANE_Handle * handle) { /* search for the given devicename in the device list */ for (auto& d : *s_devices) { - if (strcmp(d.file_name, devicename) == 0) { + if (d.file_name == devicename) { dev = &d; break; } @@ -5536,9 +5545,8 @@ sane_open_impl(SANE_String_Const devicename, SANE_Handle * handle) // empty devicename or "genesys" -> use first device if (!s_devices->empty()) { dev = &s_devices->front(); - devicename = dev->file_name; - DBG(DBG_info, "%s: empty devicename, trying `%s'\n", __func__, devicename); - } + DBG(DBG_info, "%s: empty devicename, trying `%s'\n", __func__, dev->file_name.c_str()); + } } if (!dev) @@ -5554,8 +5562,8 @@ sane_open_impl(SANE_String_Const devicename, SANE_Handle * handle) DBG(DBG_error0, " scanner and what does (not) work.\n"); } - dbg.vstatus("open device '%s'", dev->file_name); - dev->usb_dev.open(dev->file_name); + dbg.vstatus("open device '%s'", dev->file_name.c_str()); + dev->usb_dev.open(dev->file_name.c_str()); dbg.clear(); diff --git a/backend/genesys_device.cc b/backend/genesys_device.cc index 33f42f2a7..9cab33def 100644 --- a/backend/genesys_device.cc +++ b/backend/genesys_device.cc @@ -50,9 +50,6 @@ Genesys_Device::~Genesys_Device() { clear(); - - if (file_name != nullptr) - free(file_name); } void Genesys_Device::clear() diff --git a/backend/genesys_device.h b/backend/genesys_device.h index 943d15453..be3a6aab7 100644 --- a/backend/genesys_device.h +++ b/backend/genesys_device.h @@ -214,7 +214,7 @@ struct Genesys_Device // 2: USB 2.0 SANE_Int usb_mode = 0; - SANE_String file_name = nullptr; + std::string file_name; std::string calib_file; // if enabled, no calibration data will be loaded or saved to files diff --git a/backend/genesys_low.h b/backend/genesys_low.h index 55c95ea80..b651ce6d1 100644 --- a/backend/genesys_low.h +++ b/backend/genesys_low.h @@ -101,8 +101,6 @@ #include #include -#define FREE_IFNOT_NULL(x) if(x!=NULL) { free(x); x=NULL;} - #define GENESYS_RED 0 #define GENESYS_GREEN 1 #define GENESYS_BLUE 2 From f9b87de44a6ab4ae74c10be6eb242798a2b88fc3 Mon Sep 17 00:00:00 2001 From: Povilas Kanapickas Date: Fri, 2 Aug 2019 22:38:54 +0300 Subject: [PATCH 2/2] genesys: Remove manual allocations from calibration functions --- backend/genesys.cc | 45 ++++++++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/backend/genesys.cc b/backend/genesys.cc index 755f4384a..72633f06f 100644 --- a/backend/genesys.cc +++ b/backend/genesys.cc @@ -4357,21 +4357,16 @@ SANE_Range *range=NULL; * @param currdev current scanner device * @return an allocated string containing a file name */ -static char *calibration_filename(Genesys_Device *currdev) +static std::string calibration_filename(Genesys_Device *currdev) { - char *tmpstr; + std::string ret; + ret.resize(PATH_MAX); + char *ptr; char filename[80]; unsigned int count; unsigned int i; - /* allocate space for result */ - tmpstr = (char*) malloc(PATH_MAX); - if(tmpstr==NULL) - { - return NULL; - } - /* first compute the DIR where we can store cache: * 1 - home dir * 2 - $TMPDIR @@ -4425,23 +4420,29 @@ static char *calibration_filename(Genesys_Device *currdev) } /* build final final name : store dir + filename */ - if (NULL == ptr) - { - snprintf (tmpstr, PATH_MAX, "%s", filename); + if (ptr == nullptr) { + int size = std::snprintf(&ret.front(), ret.size(), "%s", filename); + ret.resize(size); } else { + int size = 0; #ifdef HAVE_MKDIR - /* make sure .sane directory exists in existing store dir */ - snprintf (tmpstr, PATH_MAX, "%s%c.sane", ptr, PATH_SEP); - mkdir(tmpstr,0700); + /* make sure .sane directory exists in existing store dir */ + size = std::snprintf(&ret.front(), ret.size(), "%s%c.sane", ptr, PATH_SEP); + ret.resize(size); + mkdir(ret.c_str(), 0700); + + ret.resize(PATH_MAX); #endif - snprintf (tmpstr, PATH_MAX, "%s%c.sane%c%s", ptr, PATH_SEP, PATH_SEP, filename); + size = std::snprintf(&ret.front(), ret.size(), "%s%c.sane%c%s", + ptr, PATH_SEP, PATH_SEP, filename); + ret.resize(size); } - DBG(DBG_info, "%s: calibration filename >%s<\n", __func__, tmpstr); + DBG(DBG_info, "%s: calibration filename >%s<\n", __func__, ret.c_str()); - return tmpstr; + return ret; } @@ -5513,7 +5514,6 @@ sane_open_impl(SANE_String_Const devicename, SANE_Handle * handle) { DBG_HELPER_ARGS(dbg, "devicename = %s", devicename); Genesys_Device *dev = nullptr; - char *tmpstr; /* devicename="" or devicename="genesys" are default values that use * first available device @@ -5600,12 +5600,11 @@ sane_open_impl(SANE_String_Const devicename, SANE_Handle * handle) /* here is the place to fetch a stored calibration cache */ if (s->dev->force_calibration == 0) { - tmpstr=calibration_filename(s->dev); - s->calibration_file = tmpstr; - s->dev->calib_file = tmpstr; + auto path = calibration_filename(s->dev); + s->calibration_file = path; + s->dev->calib_file = path; DBG(DBG_info, "%s: Calibration filename set to:\n", __func__); DBG(DBG_info, "%s: >%s<\n", __func__, s->dev->calib_file.c_str()); - free(tmpstr); catch_all_exceptions(__func__, [&]() {