@@ -1124,46 +1124,38 @@ BOOL WINAPI CertStrToNameW(DWORD dwCertEncodingType, LPCWSTR pszX500,
11241124 return ret ;
11251125}
11261126
1127- DWORD WINAPI CertGetNameStringA (PCCERT_CONTEXT pCertContext , DWORD dwType ,
1128- DWORD dwFlags , void * pvTypePara , LPSTR pszNameString , DWORD cchNameString )
1127+ DWORD WINAPI CertGetNameStringA (PCCERT_CONTEXT cert , DWORD type ,
1128+ DWORD flags , void * type_para , LPSTR name , DWORD name_len )
11291129{
1130- DWORD ret ;
1130+ DWORD len , len_mb , ret ;
1131+ LPWSTR nameW ;
11311132
1132- TRACE ("(%p, %d, %08x, %p, %p, %d)\n" , pCertContext , dwType , dwFlags ,
1133- pvTypePara , pszNameString , cchNameString );
1133+ TRACE ("(%p, %ld, %08lx, %p, %p, %ld)\n" , cert , type , flags , type_para , name , name_len );
11341134
1135- if (pszNameString )
1135+ len = CertGetNameStringW (cert , type , flags , type_para , NULL , 0 );
1136+
1137+ if (!(nameW = CryptMemAlloc (len * sizeof (* nameW ))))
11361138 {
1137- LPWSTR wideName ;
1138- DWORD nameLen ;
1139+ ERR ("No memory.\n" );
1140+ if (name && name_len ) * name = 0 ;
1141+ return 1 ;
1142+ }
11391143
1140- nameLen = CertGetNameStringW (pCertContext , dwType , dwFlags , pvTypePara ,
1141- NULL , 0 );
1142- wideName = CryptMemAlloc (nameLen * sizeof (WCHAR ));
1143- if (wideName )
1144- {
1145- CertGetNameStringW (pCertContext , dwType , dwFlags , pvTypePara ,
1146- wideName , nameLen );
1147- nameLen = WideCharToMultiByte (CP_ACP , 0 , wideName , nameLen ,
1148- pszNameString , cchNameString , NULL , NULL );
1149- if (nameLen <= cchNameString )
1150- ret = nameLen ;
1151- else
1152- {
1153- pszNameString [cchNameString - 1 ] = '\0' ;
1154- ret = cchNameString ;
1155- }
1156- CryptMemFree (wideName );
1157- }
1158- else
1159- {
1160- * pszNameString = '\0' ;
1161- ret = 1 ;
1162- }
1144+ len = CertGetNameStringW (cert , type , flags , type_para , nameW , len );
1145+ len_mb = WideCharToMultiByte (CP_ACP , 0 , nameW , len , NULL , 0 , NULL , NULL );
1146+ if (!name || !name_len )
1147+ {
1148+ CryptMemFree (nameW );
1149+ return len_mb ;
11631150 }
1164- else
1165- ret = CertGetNameStringW (pCertContext , dwType , dwFlags , pvTypePara ,
1166- NULL , 0 );
1151+
1152+ ret = WideCharToMultiByte (CP_ACP , 0 , nameW , len , name , name_len , NULL , NULL );
1153+ if (ret < len_mb )
1154+ {
1155+ name [0 ] = 0 ;
1156+ ret = 1 ;
1157+ }
1158+ CryptMemFree (nameW );
11671159 return ret ;
11681160}
11691161
0 commit comments