1
0
mirror of https://github.com/docker/docker-credential-helpers.git synced 2026-06-13 16:01:28 +05:30

implemented freeing memory in secretservice and made minor edits to osxkeychain

Signed-off-by: Avi Vaid <avaid1996@gmail.com>
This commit is contained in:
Avi Vaid
2016-07-11 19:45:37 -04:00
parent 72661b3103
commit 7566a1e399
4 changed files with 20 additions and 11 deletions
+9 -11
View File
@@ -10,11 +10,11 @@ package osxkeychain
import "C" import "C"
import ( import (
"errors" "errors"
"github.com/docker/docker-credential-helpers/credentials"
"net/url" "net/url"
"strconv" "strconv"
"strings" "strings"
"unsafe" "unsafe"
"github.com/docker/docker-credential-helpers/credentials"
) )
// errCredentialsNotFound is the specific error message returned by OS X // errCredentialsNotFound is the specific error message returned by OS X
@@ -94,19 +94,19 @@ func (h Osxkeychain) Get(serverURL string) (string, string, error) {
return user, pass, nil return user, pass, nil
} }
func (h Osxkeychain) List() ([]string, []string, error){ func (h Osxkeychain) List() ([]string, []string, error) {
var pathsC** C.char var pathsC **C.char
defer C.free(unsafe.Pointer(pathsC)) defer C.free(unsafe.Pointer(pathsC))
var acctsC** C.char var acctsC **C.char
defer C.free(unsafe.Pointer(acctsC)) defer C.free(unsafe.Pointer(acctsC))
var listLenC C.uint var listLenC C.uint
errMsg := C.keychain_list(&pathsC, &acctsC, &listLenC) errMsg := C.keychain_list(&pathsC, &acctsC, &listLenC)
if errMsg!=nil { if errMsg != nil {
defer C.free(unsafe.Pointer(errMsg)) defer C.free(unsafe.Pointer(errMsg))
goMsg := C.GoString(errMsg) goMsg := C.GoString(errMsg)
return nil, nil, errors.New(goMsg) return nil, nil, errors.New(goMsg)
} }
var listLen int; var listLen int
listLen = int(listLenC) listLen = int(listLenC)
pathTmp := (*[1 << 30]*C.char)(unsafe.Pointer(pathsC))[:listLen:listLen] pathTmp := (*[1 << 30]*C.char)(unsafe.Pointer(pathsC))[:listLen:listLen]
acctTmp := (*[1 << 30]*C.char)(unsafe.Pointer(acctsC))[:listLen:listLen] acctTmp := (*[1 << 30]*C.char)(unsafe.Pointer(acctsC))[:listLen:listLen]
@@ -114,8 +114,8 @@ func (h Osxkeychain) List() ([]string, []string, error){
paths := make([]string, listLen) paths := make([]string, listLen)
accts := make([]string, listLen) accts := make([]string, listLen)
at := 0 at := 0
for i := 0; i < listLen ; i++ { for i := 0; i < listLen; i++ {
if C.GoString(pathTmp[i])=="0" { if C.GoString(pathTmp[i]) == "0" {
continue continue
} }
paths[at] = C.GoString(pathTmp[i]) paths[at] = C.GoString(pathTmp[i])
@@ -124,9 +124,8 @@ func (h Osxkeychain) List() ([]string, []string, error){
} }
paths = paths[:at] paths = paths[:at]
accts = accts[:at] accts = accts[:at]
//still need to free all the memory we allocated in the c file
//do it here >>
C.freeListData(&pathsC, listLenC) C.freeListData(&pathsC, listLenC)
C.freeListData(&acctsC, listLenC)
return paths, accts, nil return paths, accts, nil
} }
@@ -164,4 +163,3 @@ func freeServer(s *C.struct_Server) {
C.free(unsafe.Pointer(s.host)) C.free(unsafe.Pointer(s.host))
C.free(unsafe.Pointer(s.path)) C.free(unsafe.Pointer(s.path))
} }
+8
View File
@@ -1,4 +1,5 @@
#include <string.h> #include <string.h>
#include <stdlib.h>
#include "secretservice_linux.h" #include "secretservice_linux.h"
const SecretSchema *docker_get_schema(void) const SecretSchema *docker_get_schema(void)
@@ -137,3 +138,10 @@ GError *list(char *** paths, char *** accts, unsigned int *list_l) {
*list_l = numKeys; *list_l = numKeys;
return NULL; return NULL;
} }
void freeListData(char *** data, unsigned int length) {
for(int i=0; i<length; i++) {
free((*data)[i]);
}
free(*data);
}
+2
View File
@@ -99,5 +99,7 @@ func (h Secretservice) List() ([]string, []string, error) {
paths[i] = C.GoString(pathTmp[i]) paths[i] = C.GoString(pathTmp[i])
accts[i] = C.GoString(acctTmp[i]) accts[i] = C.GoString(acctTmp[i])
} }
C.freeListData(&pathsC, listLenC)
C.freeListData(&acctsC, listLenC)
return paths, accts, nil return paths, accts, nil
} }
+1
View File
@@ -10,3 +10,4 @@ GError *add(char *server, char *username, char *secret);
GError *delete(char *server); GError *delete(char *server);
GError *get(char *server, char **username, char **secret); GError *get(char *server, char **username, char **secret);
GError *list(char *** paths, char *** accts, unsigned int *list_l); GError *list(char *** paths, char *** accts, unsigned int *list_l);
void freeListData(char *** data, unsigned int length);