This is an automated email from the git hooks/post-receive script. sebastic pushed a commit to branch master in repository shapelib.
commit ec478a070bac2822195f708eaef9157adf15b298 Author: Bas Couwenberg <[email protected]> Date: Fri Sep 15 20:43:25 2017 +0200 New upstream version 1.4.1 --- CMakeLists.txt | 2 +- ChangeLog | 13 ++- configure | 22 ++--- configure.ac | 4 +- contrib/shpgeo.c | 10 +++ shpopen.c | 252 +++++++++++++++++++++++++++++++++---------------------- web/release.html | 6 ++ 7 files changed, 196 insertions(+), 113 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e433198..c3ef935 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -111,7 +111,7 @@ if(UNIX) endif(UNIX) set(shp_SOVERSION 1) -set(shp_VERSION 1.4.0) +set(shp_VERSION 1.4.1) set_target_properties(shp PROPERTIES SOVERSION ${shp_SOVERSION} diff --git a/ChangeLog b/ChangeLog index 3e17b2d..e8fbde5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,17 @@ +2017-09-10 Even Rouault <even.rouault at spatialys.com> + + * shpopen.c: resync with GDAL copy. Make sure to zero terminate all + error messages. And fix regression regarding re-writing the last shape + of a file (https://trac.osgeo.org/gdal/ticket/7031) + +2017-07-10 Even Rouault <even.rouault at spatialys.com> + + * contrib/shpgeo.c: fix compilation on _MSC_VER < 1800 regarding lack + of NAN macro. + 2016-12-09 Even Rouault <even.rouault at spatialys.com> - * Makefile.am: install web/maptools.css + * Makefile.am: add web/maptools.css to EXTRA_DIST * Shapelib 1.4.0 released diff --git a/configure b/configure index 5d8df6f..0ceb379 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for shapelib 1.4.0. +# Generated by GNU Autoconf 2.69 for shapelib 1.4.1. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @@ -587,8 +587,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='shapelib' PACKAGE_TARNAME='shapelib' -PACKAGE_VERSION='1.4.0' -PACKAGE_STRING='shapelib 1.4.0' +PACKAGE_VERSION='1.4.1' +PACKAGE_STRING='shapelib 1.4.1' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -1340,7 +1340,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures shapelib 1.4.0 to adapt to many kinds of systems. +\`configure' configures shapelib 1.4.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1411,7 +1411,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of shapelib 1.4.0:";; + short | recursive ) echo "Configuration of shapelib 1.4.1:";; esac cat <<\_ACEOF @@ -1526,7 +1526,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -shapelib configure 1.4.0 +shapelib configure 1.4.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1925,7 +1925,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by shapelib $as_me 1.4.0, which was +It was created by shapelib $as_me 1.4.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2791,7 +2791,7 @@ fi # Define the identity of the package. PACKAGE='shapelib' - VERSION='1.4.0' + VERSION='1.4.1' cat >>confdefs.h <<_ACEOF @@ -4137,7 +4137,7 @@ unknown) esac -SHAPELIB_SO_VERSION=2:1:0 +SHAPELIB_SO_VERSION=2:2:0 ac_ext=c @@ -17351,7 +17351,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by shapelib $as_me 1.4.0, which was +This file was extended by shapelib $as_me 1.4.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -17408,7 +17408,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -shapelib config.status 1.4.0 +shapelib config.status 1.4.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/configure.ac b/configure.ac index 619d47f..7ec86d5 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ dnl Process this file with autoconf to produce a configure script. m4_define(shapelib_version_major, 1) m4_define(shapelib_version_minor, 4) -m4_define(shapelib_version_micro, 0) +m4_define(shapelib_version_micro, 1) AC_PREREQ(2.62) AC_INIT(shapelib, shapelib_version_major.shapelib_version_minor.shapelib_version_micro) @@ -16,7 +16,7 @@ AM_SILENT_RULES([yes]) m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) dnl See http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html -AC_SUBST([SHAPELIB_SO_VERSION], [2:1:0]) +AC_SUBST([SHAPELIB_SO_VERSION], [2:2:0]) AC_PROG_CC AC_PROG_CXX diff --git a/contrib/shpgeo.c b/contrib/shpgeo.c index 4d14d3a..3b04b3a 100644 --- a/contrib/shpgeo.c +++ b/contrib/shpgeo.c @@ -32,6 +32,10 @@ * use -DPROJ4 to compile in Projection support * * $Log: shpgeo.c,v $ + * Revision 1.16 2017-07-10 18:01:35 erouault + * * contrib/shpgeo.c: fix compilation on _MSC_VER < 1800 regarding lack + * of NAN macro. + * * Revision 1.15 2016-12-06 21:13:33 erouault * * configure.ac: change soname to 2:1:0 to be in sync with Debian soname. * http://bugzilla.maptools.org/show_bug.cgi?id=2628 @@ -99,6 +103,12 @@ #include "shpgeo.h" +#if defined(_MSC_VER) && _MSC_VER < 1800 +#include <float.h> +#define INFINITY (DBL_MAX + DBL_MAX) +#define NAN (INFINITY - INFINITY) +#endif + /* I'm using some shorthand throughout this file * R+ is a Clockwise Ring and is the positive portion of an object diff --git a/shpopen.c b/shpopen.c index 2ace684..f9d28c2 100644 --- a/shpopen.c +++ b/shpopen.c @@ -1,5 +1,5 @@ /****************************************************************************** - * $Id: shpopen.c,v 1.75 2016-12-05 12:44:05 erouault Exp $ + * $Id: shpopen.c,v 1.76 2017-09-10 10:11:36 erouault Exp $ * * Project: Shapelib * Purpose: Implementation of core Shapefile read/write functions. @@ -35,6 +35,11 @@ ****************************************************************************** * * $Log: shpopen.c,v $ + * Revision 1.76 2017-09-10 10:11:36 erouault + * * shpopen.c: resync with GDAL copy. Make sure to zero terminate all + * error messages. And fix regression regarding re-writing the last shape + * of a file (https://trac.osgeo.org/gdal/ticket/7031) + * * Revision 1.75 2016-12-05 12:44:05 erouault * * Major overhaul of Makefile build system to use autoconf/automake. * @@ -167,7 +172,7 @@ * avoid c++ comments * * Revision 1.38 2002/05/07 16:43:39 warmerda - * Removed debugging printf. + * Removed debugging printf() * * Revision 1.37 2002/04/10 17:35:22 warmerda * fixed bug in ring reversal code @@ -297,7 +302,7 @@ #include <stdio.h> #include <errno.h> -SHP_CVSID("$Id: shpopen.c,v 1.75 2016-12-05 12:44:05 erouault Exp $") +SHP_CVSID("$Id: shpopen.c,v 1.76 2017-09-10 10:11:36 erouault Exp $") typedef unsigned char uchar; @@ -461,11 +466,12 @@ void SHPAPI_CALL SHPWriteHeader( SHPHandle psSHP ) if( psSHP->sHooks.FSeek( psSHP->fpSHP, 0, 0 ) != 0 || psSHP->sHooks.FWrite( abyHeader, 100, 1, psSHP->fpSHP ) != 1 ) { - char szError[200]; + char szErrorMsg[200]; - snprintf( szError, sizeof(szError), + snprintf( szErrorMsg, sizeof(szErrorMsg), "Failure writing .shp header: %s", strerror(errno) ); - psSHP->sHooks.Error( szError ); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); return; } @@ -479,11 +485,12 @@ void SHPAPI_CALL SHPWriteHeader( SHPHandle psSHP ) if( psSHP->sHooks.FSeek( psSHP->fpSHX, 0, 0 ) != 0 || psSHP->sHooks.FWrite( abyHeader, 100, 1, psSHP->fpSHX ) != 1 ) { - char szError[200]; + char szErrorMsg[200]; - snprintf( szError, sizeof(szError), + snprintf( szErrorMsg, sizeof(szErrorMsg), "Failure writing .shx header: %s", strerror(errno) ); - psSHP->sHooks.Error( szError ); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); return; } @@ -509,11 +516,12 @@ void SHPAPI_CALL SHPWriteHeader( SHPHandle psSHP ) if( (int)psSHP->sHooks.FWrite( panSHX, sizeof(int32)*2, psSHP->nRecords, psSHP->fpSHX ) != psSHP->nRecords ) { - char szError[200]; + char szErrorMsg[200]; - snprintf( szError, sizeof(szError), + snprintf( szErrorMsg, sizeof(szErrorMsg), "Failure writing .shx contents: %s", strerror(errno) ); - psSHP->sHooks.Error( szError ); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); } free( panSHX ); @@ -671,14 +679,12 @@ SHPOpenLL( const char * pszLayer, const char * pszAccess, SAHooks *psHooks ) pabyBuf = (uchar *) malloc(100); psSHP->sHooks.FRead( pabyBuf, 100, 1, psSHP->fpSHP ); - psSHP->nFileSize = ((unsigned int)pabyBuf[24] * 256 * 256 * 256 - + (unsigned int)pabyBuf[25] * 256 * 256 - + (unsigned int)pabyBuf[26] * 256 - + (unsigned int)pabyBuf[27]); - if( psSHP->nFileSize < 0xFFFFFFFFU / 2 ) + psSHP->nFileSize = ((unsigned int)pabyBuf[24]<<24)|(pabyBuf[25]<<16)| + (pabyBuf[26]<<8)|pabyBuf[27]; + if( psSHP->nFileSize < UINT_MAX / 2 ) psSHP->nFileSize *= 2; else - psSHP->nFileSize = 0xFFFFFFFEU; + psSHP->nFileSize = (UINT_MAX / 2) * 2; /* -------------------------------------------------------------------- */ /* Read SHX file Header info */ @@ -692,26 +698,28 @@ SHPOpenLL( const char * pszLayer, const char * pszAccess, SAHooks *psHooks ) psSHP->sHooks.Error( ".shx file is unreadable, or corrupt." ); psSHP->sHooks.FClose( psSHP->fpSHP ); psSHP->sHooks.FClose( psSHP->fpSHX ); + free( pabyBuf ); free( psSHP ); return( NULL ); } - psSHP->nRecords = pabyBuf[27] + pabyBuf[26] * 256 - + pabyBuf[25] * 256 * 256 + (pabyBuf[24] & 0x7F) * 256 * 256 * 256; + psSHP->nRecords = pabyBuf[27]|(pabyBuf[26]<<8)|(pabyBuf[25]<<16)| + ((pabyBuf[24] & 0x7F)<<24); psSHP->nRecords = (psSHP->nRecords - 50) / 4; psSHP->nShapeType = pabyBuf[32]; if( psSHP->nRecords < 0 || psSHP->nRecords > 256000000 ) { - char szError[200]; + char szErrorMsg[200]; - snprintf( szError, sizeof(szError), + snprintf( szErrorMsg, sizeof(szErrorMsg), "Record count in .shp header is %d, which seems\n" "unreasonable. Assuming header is corrupt.", psSHP->nRecords ); - psSHP->sHooks.Error( szError ); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); psSHP->sHooks.FClose( psSHP->fpSHP ); psSHP->sHooks.FClose( psSHP->fpSHX ); free( psSHP ); @@ -791,13 +799,14 @@ SHPOpenLL( const char * pszLayer, const char * pszAccess, SAHooks *psHooks ) psSHP->panRecSize == NULL || (!bLazySHXLoading && pabyBuf == NULL)) { - char szError[200]; + char szErrorMsg[200]; - snprintf( szError, sizeof(szError), + snprintf( szErrorMsg, sizeof(szErrorMsg), "Not enough memory to allocate requested memory (nRecords=%d).\n" "Probably broken SHP file", psSHP->nRecords ); - psSHP->sHooks.Error( szError ); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); psSHP->sHooks.FClose( psSHP->fpSHP ); psSHP->sHooks.FClose( psSHP->fpSHX ); if (psSHP->panRecOffset) free( psSHP->panRecOffset ); @@ -817,12 +826,13 @@ SHPOpenLL( const char * pszLayer, const char * pszAccess, SAHooks *psHooks ) if( (int) psSHP->sHooks.FRead( pabyBuf, 8, psSHP->nRecords, psSHP->fpSHX ) != psSHP->nRecords ) { - char szError[200]; + char szErrorMsg[200]; - snprintf( szError, sizeof(szError), + snprintf( szErrorMsg, sizeof(szErrorMsg), "Failed to read all values for %d records in .shx file: %s.", psSHP->nRecords, strerror(errno) ); - psSHP->sHooks.Error( szError ); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); /* SHX is short or unreadable for some reason. */ psSHP->sHooks.FClose( psSHP->fpSHP ); @@ -857,6 +867,7 @@ SHPOpenLL( const char * pszLayer, const char * pszAccess, SAHooks *psHooks ) char str[128]; snprintf( str, sizeof(str), "Invalid offset for entity %d", i); + str[sizeof(str)-1] = '\0'; psSHP->sHooks.Error( str ); SHPClose(psSHP); @@ -868,6 +879,7 @@ SHPOpenLL( const char * pszLayer, const char * pszAccess, SAHooks *psHooks ) char str[128]; snprintf( str, sizeof(str), "Invalid length for entity %d", i); + str[sizeof(str)-1] = '\0'; psSHP->sHooks.Error( str ); SHPClose(psSHP); @@ -1014,14 +1026,12 @@ SHPRestoreSHX ( const char * pszLayer, const char * pszAccess, SAHooks *psHooks pabyBuf = (uchar *) malloc(100); psHooks->FRead( pabyBuf, 100, 1, fpSHP ); - nSHPFilesize = ((unsigned int)pabyBuf[24] * 256 * 256 * 256 - + (unsigned int)pabyBuf[25] * 256 * 256 - + (unsigned int)pabyBuf[26] * 256 - + (unsigned int)pabyBuf[27]); - if( nSHPFilesize < 0xFFFFFFFFU / 2 ) + nSHPFilesize = ((unsigned int)pabyBuf[24]<<24)|(pabyBuf[25]<<16)| + (pabyBuf[26]<<8)|pabyBuf[27]; + if( nSHPFilesize < UINT_MAX / 2 ) nSHPFilesize *= 2; else - nSHPFilesize = 0xFFFFFFFEU; + nSHPFilesize = (UINT_MAX / 2) * 2; snprintf( pszFullname, nFullnameLen, "%s.shx", pszBasename ); fpSHX = psHooks->FOpen( pszFullname, pszSHXAccess ); @@ -1074,11 +1084,7 @@ SHPRestoreSHX ( const char * pszLayer, const char * pszAccess, SAHooks *psHooks } else { - nMessageLen = strlen( pszBasename ) * 2 + 256; - pszMessage = (char *) malloc( nMessageLen ); - snprintf( pszMessage, nMessageLen, "Error parsing .shp to restore .shx" ); - psHooks->Error( pszMessage ); - free( pszMessage ); + psHooks->Error( "Error parsing .shp to restore .shx" ); psHooks->FClose( fpSHX ); psHooks->FClose( fpSHP ); @@ -1277,7 +1283,12 @@ SHPCreateLL( const char * pszLayer, int nShapeType, SAHooks *psHooks ) fpSHP = psHooks->FOpen(pszFullname, "wb" ); if( fpSHP == NULL ) { - psHooks->Error( "Failed to create file .shp file." ); + char szErrorMsg[200]; + snprintf( szErrorMsg, sizeof(szErrorMsg), + "Failed to create file %s: %s", + pszFullname, strerror(errno) ); + psHooks->Error( szErrorMsg ); + goto error; } @@ -1285,7 +1296,11 @@ SHPCreateLL( const char * pszLayer, int nShapeType, SAHooks *psHooks ) fpSHX = psHooks->FOpen(pszFullname, "wb" ); if( fpSHX == NULL ) { - psHooks->Error( "Failed to create file .shx file." ); + char szErrorMsg[200]; + snprintf( szErrorMsg, sizeof(szErrorMsg), + "Failed to create file %s: %s", + pszFullname, strerror(errno) ); + psHooks->Error( szErrorMsg ); goto error; } @@ -1323,11 +1338,12 @@ SHPCreateLL( const char * pszLayer, int nShapeType, SAHooks *psHooks ) /* -------------------------------------------------------------------- */ if( psHooks->FWrite( abyHeader, 100, 1, fpSHP ) != 1 ) { - char szError[200]; + char szErrorMsg[200]; - snprintf( szError, sizeof(szError), + snprintf( szErrorMsg, sizeof(szErrorMsg), "Failed to write .shp header: %s", strerror(errno) ); - psHooks->Error( szError ); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psHooks->Error( szErrorMsg ); goto error; } @@ -1341,11 +1357,12 @@ SHPCreateLL( const char * pszLayer, int nShapeType, SAHooks *psHooks ) if( psHooks->FWrite( abyHeader, 100, 1, fpSHX ) != 1 ) { - char szError[200]; + char szErrorMsg[200]; - snprintf( szError, sizeof(szError), + snprintf( szErrorMsg, sizeof(szErrorMsg), "Failure writing .shx header: %s", strerror(errno) ); - psHooks->Error( szError ); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psHooks->Error( szErrorMsg ); goto error; } @@ -1515,24 +1532,26 @@ SHPCreateObject( int nSHPType, int nShapeId, int nParts, /* -------------------------------------------------------------------- */ if( nVertices > 0 ) { - psObject->padfX = (double *) calloc(sizeof(double),nVertices); - psObject->padfY = (double *) calloc(sizeof(double),nVertices); - psObject->padfZ = (double *) calloc(sizeof(double),nVertices); - psObject->padfM = (double *) calloc(sizeof(double),nVertices); - - for( i = 0; i < nVertices; i++ ) - { - if( padfX != NULL ) - psObject->padfX[i] = padfX[i]; - if( padfY != NULL ) - psObject->padfY[i] = padfY[i]; - if( padfZ != NULL && bHasZ ) - psObject->padfZ[i] = padfZ[i]; - if( padfM != NULL && bHasM ) - psObject->padfM[i] = padfM[i]; - } + size_t nSize = sizeof(double) * nVertices; + psObject->padfX = (double *) padfX ? malloc(nSize) : + calloc(sizeof(double),nVertices); + psObject->padfY = (double *) padfY ? malloc(nSize) : + calloc(sizeof(double),nVertices); + psObject->padfZ = (double *) padfZ && bHasZ ? malloc(nSize) : + calloc(sizeof(double),nVertices); + psObject->padfM = (double *) padfM && bHasM ? malloc(nSize) : + calloc(sizeof(double),nVertices); + if( padfX != NULL ) + memcpy(psObject->padfX, padfX, nSize); + if( padfY != NULL ) + memcpy(psObject->padfY, padfY, nSize); + if( padfZ != NULL && bHasZ ) + memcpy(psObject->padfZ, padfZ, nSize); if( padfM != NULL && bHasM ) + { + memcpy(psObject->padfM, padfM, nSize); psObject->bMeasureIsUsed = TRUE; + } } /* -------------------------------------------------------------------- */ @@ -1576,7 +1595,8 @@ SHPWriteObject(SHPHandle psSHP, int nShapeId, SHPObject * psObject ) int i; uchar *pabyRec; int32 i32; - int bExtendFile = FALSE; + int bAppendToLastRecord = FALSE; + int bAppendToFile = FALSE; psSHP->bUpdated = TRUE; @@ -1864,24 +1884,32 @@ SHPWriteObject(SHPHandle psSHP, int nShapeId, SHPObject * psObject ) /* -------------------------------------------------------------------- */ /* Establish where we are going to put this record. If we are */ -/* rewriting and existing record, and it will fit, then put it */ -/* back where the original came from. Otherwise write at the end. */ +/* rewriting the last record of the file, then we can update it in */ +/* place. Otherwise if rewriting an existing record, and it will */ +/* fit, then put it back where the original came from. Otherwise */ +/* write at the end. */ /* -------------------------------------------------------------------- */ - if( nShapeId == -1 || psSHP->panRecSize[nShapeId] < nRecordSize-8 ) + if( nShapeId != -1 && psSHP->panRecOffset[nShapeId] + + psSHP->panRecSize[nShapeId] + 8 == psSHP->nFileSize ) + { + nRecordOffset = psSHP->panRecOffset[nShapeId]; + bAppendToLastRecord = TRUE; + } + else if( nShapeId == -1 || psSHP->panRecSize[nShapeId] < nRecordSize-8 ) { - unsigned int nExpectedSize = psSHP->nFileSize + nRecordSize; - if( nExpectedSize < psSHP->nFileSize ) // due to unsigned int overflow + if( psSHP->nFileSize > UINT_MAX - nRecordSize) { char str[128]; snprintf( str, sizeof(str), "Failed to write shape object. " "File size cannot reach %u + %u.", psSHP->nFileSize, nRecordSize ); + str[sizeof(str)-1] = '\0'; psSHP->sHooks.Error( str ); free( pabyRec ); return -1; } - bExtendFile = TRUE; + bAppendToFile = TRUE; nRecordOffset = psSHP->nFileSize; } else @@ -1909,24 +1937,26 @@ SHPWriteObject(SHPHandle psSHP, int nShapeId, SHPObject * psObject ) /* -------------------------------------------------------------------- */ if( psSHP->sHooks.FSeek( psSHP->fpSHP, nRecordOffset, 0 ) != 0 ) { - char szError[200]; + char szErrorMsg[200]; - snprintf( szError, sizeof(szError), + snprintf( szErrorMsg, sizeof(szErrorMsg), "Error in psSHP->sHooks.FSeek() while writing object to .shp file: %s", strerror(errno) ); - psSHP->sHooks.Error( szError ); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); free( pabyRec ); return -1; } if( psSHP->sHooks.FWrite( pabyRec, nRecordSize, 1, psSHP->fpSHP ) < 1 ) { - char szError[200]; + char szErrorMsg[200]; - snprintf( szError, sizeof(szError), + snprintf( szErrorMsg, sizeof(szErrorMsg), "Error in psSHP->sHooks.FWrite() while writing object of %u bytes to .shp file: %s", nRecordSize, strerror(errno) ); - psSHP->sHooks.Error( szError ); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); free( pabyRec ); return -1; @@ -1934,7 +1964,11 @@ SHPWriteObject(SHPHandle psSHP, int nShapeId, SHPObject * psObject ) free( pabyRec ); - if( bExtendFile ) + if( bAppendToLastRecord ) + { + psSHP->nFileSize = psSHP->panRecOffset[nShapeId] + nRecordSize; + } + else if( bAppendToFile ) { if( nShapeId == -1 ) nShapeId = psSHP->nRecords++; @@ -2072,6 +2106,7 @@ SHPReadObject( SHPHandle psSHP, int hEntity ) snprintf( str, sizeof(str), "Error in fseek()/fread() reading object from .shx file at offset %d", 100 + 8 * hEntity); + str[sizeof(str)-1] = '\0'; psSHP->sHooks.Error( str ); return NULL; @@ -2084,6 +2119,7 @@ SHPReadObject( SHPHandle psSHP, int hEntity ) char str[128]; snprintf( str, sizeof(str), "Invalid offset for entity %d", hEntity); + str[sizeof(str)-1] = '\0'; psSHP->sHooks.Error( str ); return NULL; @@ -2093,6 +2129,7 @@ SHPReadObject( SHPHandle psSHP, int hEntity ) char str[128]; snprintf( str, sizeof(str), "Invalid length for entity %d", hEntity); + str[sizeof(str)-1] = '\0'; psSHP->sHooks.Error( str ); return NULL; @@ -2116,41 +2153,45 @@ SHPReadObject( SHPHandle psSHP, int hEntity ) nNewBufSize = INT_MAX; /* Before allocating too much memory, check that the file is big enough */ - if( nEntitySize >= 10 * 1024 * 1024 && - (psSHP->panRecOffset[hEntity] >= psSHP->nFileSize || - (unsigned int)nEntitySize > psSHP->nFileSize - psSHP->panRecOffset[hEntity]) ) + /* and do not trust the file size in the header the first time we */ + /* need to allocate more than 10 MB */ + if( nNewBufSize >= 10 * 1024 * 1024 && + psSHP->nBufSize < 10 * 1024 * 1024 ) { - /* We do as is we didn't trust the file size in the header */ SAOffset nFileSize; psSHP->sHooks.FSeek( psSHP->fpSHP, 0, 2 ); nFileSize = psSHP->sHooks.FTell(psSHP->fpSHP); - if( nFileSize >= 0xFFFFFFFFU ) - psSHP->nFileSize = 0xFFFFFFFFU; + if( nFileSize >= UINT_MAX ) + psSHP->nFileSize = UINT_MAX; else psSHP->nFileSize = (unsigned int)nFileSize; + } - if( psSHP->panRecOffset[hEntity] >= psSHP->nFileSize || - (unsigned int)nEntitySize > psSHP->nFileSize - psSHP->panRecOffset[hEntity] ) - { - char str[128]; - snprintf( str, sizeof(str), - "Error in fread() reading object of size %d at offset %u from .shp file", - nEntitySize, psSHP->panRecOffset[hEntity] ); + if( psSHP->panRecOffset[hEntity] >= psSHP->nFileSize || + /* We should normally use nEntitySize instead of*/ + /* psSHP->panRecSize[hEntity] in the below test, but because of */ + /* the case of non conformant .shx files detailed a bit below, */ + /* let be more tolerant */ + psSHP->panRecSize[hEntity] > psSHP->nFileSize - psSHP->panRecOffset[hEntity] ) + { + char str[128]; + snprintf( str, sizeof(str), + "Error in fread() reading object of size %d at offset %u from .shp file", + nEntitySize, psSHP->panRecOffset[hEntity] ); + str[sizeof(str)-1] = '\0'; - psSHP->sHooks.Error( str ); - return NULL; - } + psSHP->sHooks.Error( str ); + return NULL; } pabyRecNew = (uchar *) SfRealloc(psSHP->pabyRec,nNewBufSize); if (pabyRecNew == NULL) { - char szError[200]; - - snprintf( szError, sizeof(szError), + snprintf( szErrorMsg, sizeof(szErrorMsg), "Not enough memory to allocate requested memory (nNewBufSize=%d). " "Probably broken SHP file", nNewBufSize); - psSHP->sHooks.Error( szError ); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); return NULL; } @@ -2178,6 +2219,7 @@ SHPReadObject( SHPHandle psSHP, int hEntity ) snprintf( str, sizeof(str), "Error in fseek() reading object from .shp file at offset %u", psSHP->panRecOffset[hEntity]); + str[sizeof(str)-1] = '\0'; psSHP->sHooks.Error( str ); return NULL; @@ -2205,6 +2247,7 @@ SHPReadObject( SHPHandle psSHP, int hEntity ) snprintf( str, sizeof(str), "Sanity check failed when trying to recover from inconsistent .shx/.shp with shape %d", hEntity ); + str[sizeof(str)-1] = '\0'; psSHP->sHooks.Error( str ); return NULL; @@ -2220,6 +2263,7 @@ SHPReadObject( SHPHandle psSHP, int hEntity ) snprintf( str, sizeof(str), "Error in fread() reading object of size %d at offset %u from .shp file", nEntitySize, psSHP->panRecOffset[hEntity] ); + str[sizeof(str)-1] = '\0'; psSHP->sHooks.Error( str ); return NULL; @@ -2230,6 +2274,7 @@ SHPReadObject( SHPHandle psSHP, int hEntity ) snprintf(szErrorMsg, sizeof(szErrorMsg), "Corrupted .shp file : shape %d : nEntitySize = %d", hEntity, nEntitySize); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; psSHP->sHooks.Error( szErrorMsg ); return NULL; } @@ -2279,6 +2324,7 @@ SHPReadObject( SHPHandle psSHP, int hEntity ) snprintf(szErrorMsg, sizeof(szErrorMsg), "Corrupted .shp file : shape %d : nEntitySize = %d", hEntity, nEntitySize); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; psSHP->sHooks.Error( szErrorMsg ); SHPDestroyObject(psShape); return NULL; @@ -2313,6 +2359,7 @@ SHPReadObject( SHPHandle psSHP, int hEntity ) snprintf(szErrorMsg, sizeof(szErrorMsg), "Corrupted .shp file : shape %d, nPoints=%u, nParts=%u.", hEntity, nPoints, nParts); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; psSHP->sHooks.Error( szErrorMsg ); SHPDestroyObject(psShape); return NULL; @@ -2337,6 +2384,7 @@ SHPReadObject( SHPHandle psSHP, int hEntity ) snprintf(szErrorMsg, sizeof(szErrorMsg), "Corrupted .shp file : shape %d, nPoints=%u, nParts=%u, nEntitySize=%d.", hEntity, nPoints, nParts, nEntitySize); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; psSHP->sHooks.Error( szErrorMsg ); SHPDestroyObject(psShape); return NULL; @@ -2369,6 +2417,7 @@ SHPReadObject( SHPHandle psSHP, int hEntity ) snprintf(szErrorMsg, sizeof(szErrorMsg), "Not enough memory to allocate requested memory (nPoints=%u, nParts=%u) for shape %d. " "Probably broken SHP file", nPoints, nParts, hEntity ); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; psSHP->sHooks.Error( szErrorMsg ); SHPDestroyObject(psShape); return NULL; @@ -2394,6 +2443,7 @@ SHPReadObject( SHPHandle psSHP, int hEntity ) snprintf(szErrorMsg, sizeof(szErrorMsg), "Corrupted .shp file : shape %d : panPartStart[%d] = %d, nVertices = %d", hEntity, i, psShape->panPartStart[i], psShape->nVertices); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; psSHP->sHooks.Error( szErrorMsg ); SHPDestroyObject(psShape); return NULL; @@ -2403,6 +2453,7 @@ SHPReadObject( SHPHandle psSHP, int hEntity ) snprintf(szErrorMsg, sizeof(szErrorMsg), "Corrupted .shp file : shape %d : panPartStart[%d] = %d, panPartStart[%d] = %d", hEntity, i, psShape->panPartStart[i], i - 1, psShape->panPartStart[i - 1]); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; psSHP->sHooks.Error( szErrorMsg ); SHPDestroyObject(psShape); return NULL; @@ -2516,6 +2567,7 @@ SHPReadObject( SHPHandle psSHP, int hEntity ) snprintf(szErrorMsg, sizeof(szErrorMsg), "Corrupted .shp file : shape %d : nEntitySize = %d", hEntity, nEntitySize); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; psSHP->sHooks.Error( szErrorMsg ); SHPDestroyObject(psShape); return NULL; @@ -2530,6 +2582,7 @@ SHPReadObject( SHPHandle psSHP, int hEntity ) snprintf(szErrorMsg, sizeof(szErrorMsg), "Corrupted .shp file : shape %d : nPoints = %u", hEntity, nPoints); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; psSHP->sHooks.Error( szErrorMsg ); SHPDestroyObject(psShape); return NULL; @@ -2545,6 +2598,7 @@ SHPReadObject( SHPHandle psSHP, int hEntity ) snprintf(szErrorMsg, sizeof(szErrorMsg), "Corrupted .shp file : shape %d : nPoints = %u, nEntitySize = %d", hEntity, nPoints, nEntitySize); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; psSHP->sHooks.Error( szErrorMsg ); SHPDestroyObject(psShape); return NULL; @@ -2572,6 +2626,7 @@ SHPReadObject( SHPHandle psSHP, int hEntity ) snprintf(szErrorMsg, sizeof(szErrorMsg), "Not enough memory to allocate requested memory (nPoints=%u) for shape %d. " "Probably broken SHP file", nPoints, hEntity ); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; psSHP->sHooks.Error( szErrorMsg ); SHPDestroyObject(psShape); return NULL; @@ -2682,6 +2737,7 @@ SHPReadObject( SHPHandle psSHP, int hEntity ) snprintf(szErrorMsg, sizeof(szErrorMsg), "Corrupted .shp file : shape %d : nEntitySize = %d", hEntity, nEntitySize); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; psSHP->sHooks.Error( szErrorMsg ); SHPDestroyObject(psShape); return NULL; diff --git a/web/release.html b/web/release.html index ea0f3d6..ad2349d 100644 --- a/web/release.html +++ b/web/release.html @@ -12,6 +12,12 @@ the project at www.freshmeat.net. This is currently the only reliable way of finding out about new releases since there is no shapelib specific mailing list.<p> +<b>Release 1.4.1</b>: +<ul> +<li> Fix a regression regarding re-writing the last shape + of a file (<a href="https://trac.osgeo.org/gdal/ticket/7031">GDAL #7031</a>) +</ul> + <b>Release 1.4.0</b>: <ul> <li> Old Makefile build replaced by autoconf/automake (by Sandro Mani) -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/shapelib.git _______________________________________________ Pkg-grass-devel mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel

