On Wed, Apr 18, 2012 at 2:15 AM, Julian Foad <julianf...@btopenworld.com> wrote:
> Blair Zajac wrote:
>
>> In case of an illegal svn_checksum_kind_t being passed to
>> svn_checksum__from_digest(), I want to change it from
>>
>> svn_checksum_t *
>> svn_checksum__from_digest(const unsigned char *digest,
>>                           svn_checksum_kind_t kind,
>>                           apr_pool_t *result_pool);
>>
>> to
>>
>> svn_error_t *
>> svn_checksum__from_digest(svn_checksum_t **checksum,
>>                           const unsigned char *digest,
>>                           svn_checksum_kind_t kind,
>>                           apr_pool_t *result_pool);
>
> Wouldn't a better API be:
>
>   svn_checksum_t *
>   svn_checksum__from_digest_md5(digest, result_pool);
>   svn_checksum_t *
>   svn_checksum__from_digest_sha1(digest, result_pool);
>
> since all current callers want just one specific kind (apart from internal 
> calls from the implementations of svn_checksum_dup and 
> svn_checksum_empty_checksum)?

No.  This would be the only case where a specific checksum kind is
embedded in the API name rather than as a parameter.  The latter makes
extending the API easier in the future, and localizes the 'switch'
statement to that method.  What would be the benefit of separate APIs?

> Notice that svn_checksum_empty_checksum() returns NULL if the kind is not 
> recognized, while svn_checksum_dup() does no such check and would pass the 
> unknown kind into ...from_digest().
>
> Therefore it appears that _dup() is the only caller that could have been 
> passing a bad kind -- at least in current trunk code; it may be different in 
> whatever version you're running.  And so, to fix the crash, you will still 
> need to decide how _dup() should handle a bogus checksum struct.  You could 
> have _dup() return NULL, but unless the callers check for null that would 
> just defer the crash.  It would be a little better to call 
> SVN_ERR_MALFUNCTION_NO_RETURN(), to give the client program a little more 
> awareness of the abnormal termination.
>
>
>> This is to prevent a core dump we've observed with our RPC server.
>>
>> The function is in a public .h file but shown as private.  Do I need to add
>> svn_checksum__from_digest2() or can I just change it?
>
> We're allowed to just change it, as I understand it.
>
> (The closest thing I can find in 'hacking' is 
> <http://subversion.apache.org/docs/community-guide/conventions.html#interface-visibility>. 
>  But that doesn't seem to mention the nuances of ABI vs. API and the issue 
> of, IIRC, all symbols in a shared library getting into a Windows DLL ABI even 
> if they're supposed to be private, or whatever exactly that issue was.)

Nobody should be calling this function anyway, so ABI shouldn't be an
issue, IIUC.

-Hyrum



-- 

uberSVN: Apache Subversion Made Easy
http://www.uberSVN.com/

Reply via email to