Commit Graph

23 Commits

Author SHA1 Message Date
William S Fulton de573cda78 Pass SWIG_FromCharPtrAndSize and friends on to the C compiler
A bare #define at the start of a line in a brace delimited %fragment body is
consumed by the SWIG preprocessor and never reaches the generated wrapper. The
macro therefore only exists at SWIG level and code that SWIG does not macro
expand, such as a typemap delimited with %{ ... %}, is left referring to an
undefined name. Use %#define so the definition is emitted for the C compiler.

Fixes SWIG_FromCharPtrAndSize for Python, SWIG_FromBinaryCharPtrAndSize for
Octave, Perl, R and Ruby, SWIG_ToUint8Array and SWIG_FromUint8Array for
JavaScript, and the SWIG_AsVal_* and SWIG_From_* macros in the Scilab char,
short, signed char, unsigned char, unsigned long and long long files.

Lib/scilab/scipointer.swg is deliberately left alone. Its fragments are never
requested by any typemap, so they are only emitted as SWIG preprocessor
definitions; switching them to %#define drops SWIG_ConvertPtr and
SWIG_NewPointerObj from the generated code entirely. Fixing those needs the
definitions moving to a runtime insert, as the other target languages do.

Add a common test case charptr_fragment. It uses a %{ ... %} delimited typemap
so the macro name survives into the wrapper, which only compiles when the
library defines the macro for the C compiler. The target languages without
these macros wrap the same functions using their default typemaps. Verified
that the generated Python module fails to load before this change with an
undefined symbol for SWIG_FromCharPtrAndSize.

Follows on from #3522.

Assisted-by: Claude Code (Opus 5)
2026-07-31 00:10:40 +01:00
Erez Geva 95f92e02c6 Review changes 2026-05-25 13:17:29 +01:00
William S Fulton 0c291fa448 Fix one-byte buffer overflow in cdata.i memmove
The cdata.i (const void *BYTES, size_t LENGTH) typemap took LENGTH from
SWIG_AsCharPtrAndSize, whose psize includes a trailing NUL (data length
+ 1). When the destination buffer is sized exactly to the data, memmove
wrote one byte past the end. Confirmed with valgrind: "Invalid write of
size 1, 0 bytes after a block of size 512".

- Make SWIG_AsCharPtrAndSize binary aware in the languages that use the
  generic Lib/cdata.i (Python, Perl, Ruby, Octave, R): when the caller
  passes SWIG_BINARYSTR it now reports the exact byte count, not data
  + 1. Non cdata callers are unaffected as they never set the flag.
- Lua li_cdata_bytes tests looped to 0x99 instead of 0xff, verifying
  only 154 of the 256 byte values; corrected to 0xff.
- Tcl cdata.i passed an int * to Tcl_GetSizeIntFromObj, which expects
  a Tcl_Size * on Tcl 8.7 and 9; use Tcl_Size and reject values that
  are not a byte.
- CHANGES.current: document the cdata type change and the overflow fix.

Assisted-by: Claude Opus 4.7
2026-05-25 13:17:15 +01:00
William S Fulton da33dfe05b Rename bin abbreviation to binary in cdata identifiers
Use the full English word in the identifiers added by the previous
commit for cdata raw byte handling:

  SWIG_BINSTR                 -> SWIG_BINARYSTR
  SWIG_BINSTRMASK             -> SWIG_BINARYSTRMASK
  SWIG_AddBinMask             -> SWIG_AddBinaryStrMask
  SWIG_DelBinMask             -> SWIG_DelBinaryStrMask
  SWIG_IsBinStr               -> SWIG_IsBinaryStr
  SWIG_FromBinCharPtrAndSize  -> SWIG_FromBinaryCharPtrAndSize
  useBin (local variable)     -> use_binary

Touches the constants in Lib/swigrun.swg, the SWIG_FromBinary*
macro defines in pystrings.swg, perlstrings.swg, rubystrings.swg,
octprimtypes.swg and rfragments.swg, and all call sites in
Lib/cdata.i and Lib/python/pystrings.swg.

Assisted-by: Claude Opus 4.7
2026-05-25 13:16:09 +01:00
Erez Geva cd569d122a cdata.i changes and new test li_cdata_bytes
Fix guile cdata.

Add SWIG_BINSTR flag
- Add SWIG_FromBinCharPtrAndSize with the new flag
  To add languages that use Lib/cdata.i.
- python use binary string by using the new SWIG_BINSTR
  in SWIG_AsCharPtrAndSize and SWIG_FromBinCharPtrAndSize.

Languages that were changed to uses list
- Tcl use list of integers.
- scilab use list of uint8.
  And support passing list of numbers to C.

Add support to JavaScript
- use Uint8Array instead of strings.
- Add li_cdata_carrays. tests.
- Add li_cdata_bytes tests.
- Use Debian node-addon-api package location.
- napi folder location to Examples/test-suite/javascript/Makefile.in.
- Update documentation.

Update cdata.i documentation

This new cdata test focus on:
- Ensure we can receive proper data from C and pass proper data back to C.
- Use all possoble byte values , i.e. the full range of 0 to 255
  and ensure values 128 to 255 do not pass Unicode transformation (UTF-8/16).
- Ensure zero is a valid value and not a string null termination
  nor a modified UTF-8 which transform U+0000 to 0xC0 0x80.
- Check mutability of the cdata object.

Signed-off-by: Erez Geva <ErezGeva2@gmail.com>
2026-05-25 13:16:09 +01:00
Erez Geva 5107439255 Replace `%new_copy_array` with protected allocation
Signed-off-by: Erez Geva <ErezGeva2@gmail.com>
2026-05-19 21:01:30 +01:00
Klaus Kämpf 23771ef027 Ruby: Replace all occurences of STR2CSTR macro with calls to StringValuePtr
STR2CSTR was deprecated in Ruby since years and got finally removed
in Ruby 1.9


git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@13967 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2012-12-14 15:48:31 +00:00
Gonzalo Garramuno 4b8d11d0e2 Fixed ruby's newobject1 and newobject2 demos.
Added swig_assert.rb and started using it in some tests.
Added my patches to ruby.cxx, rubyrun.swg, rubystrings.swg
and rubytracking.swg [see: sourceforge]



git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@9691 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2007-04-28 04:20:28 +00:00
Olly Betts 2f6a268e55 Support building with recent versions of the Ruby 1.9 development branch.
Fixes bug #1560092.


git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@9333 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2006-09-23 21:39:09 +00:00
Luigi Ballabio a02fee0e9e Support for Ruby 1.6
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@8992 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2006-03-09 08:34:09 +00:00
Marcelo Matus b92bf84691 reduce the aliasing warnings (when compiling with CFLAGS='-O2 -Wstrict-aliasing=2') to the minimum, ie, enums and pointer to functions
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@8885 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2006-02-23 22:24:30 +00:00
Charlie Savage 5ff6b71990 Undid change to check for nil object since it was not valid because it disallowed passing null pointers.
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@8417 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2006-01-13 22:27:44 +00:00
Charlie Savage 231d2a5f7b Added check for nil object being passed to SWIG_AsCharPtrAndSize. If a nil object is passed in then an error is returned.
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@8416 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2006-01-13 21:52:13 +00:00
Marcelo Matus abbf8b406a more on the TypeQuery fix
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@7971 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2005-12-10 23:53:53 +00:00
Marcelo Matus ae761ca3ba fix extra calls to TypeQuery for 'char *' and 'wchar_t *'
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@7968 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2005-12-10 20:20:19 +00:00
Marcelo Matus 3c65cea431 Perl added to the Unified typemap library, cleaner way to use the library, and 'normalized' macro names
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@7707 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2005-10-24 14:59:05 +00:00
Marcelo Matus 7e5e4fd1f9 massive typemap unification
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@7676 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2005-10-18 13:24:15 +00:00
Charlie Savage 2531e8d5f5 Fixed handling of char. This was needed due to changes in handling of %constants in ruby.cxx
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@7625 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2005-10-08 19:51:51 +00:00
Charlie Savage 65a0a3b9f2 Fixed handling of constants. Previously if a %constant directive was defined before a #define it would not work correctly.
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@7578 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2005-10-03 19:47:06 +00:00
Charlie Savage 8802ee4035 Added a typemap %typemap(in) (int LENGTH, char *STRING) that is simply the reverse of %typemap(in) (char *STRING, int LENGTH).
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@7533 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2005-09-26 06:06:44 +00:00
Lyle Johnson d79678c619 Added "directorout" typemaps for char * and const char * return values.
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@6152 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2004-08-26 01:57:06 +00:00
Lyle Johnson 7322ef7cb7 Modified the "varin" typemap for a dimensionless char array to generate
a warning message, and to raise an exception if the typemap is actually
invoked at runtime. This is needed to avoid problems for the case when
wrapping an extern char[] declaration, where the array size is truly
unknown.


git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@6151 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2004-08-26 01:48:40 +00:00
Lyle Johnson db3148bad0 Break the standard Ruby typemaps out into a number of smaller files
which are included by ruby.swg.


git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@6121 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2004-08-24 12:28:07 +00:00